反序列化为正确的子对象

本文关键字:对象 反序列化 | 更新日期: 2023-09-27 17:50:45

我试图将父母和不同孩子的混合反序列化为List<parent>。不幸的是,我的子字段的所有额外字段被丢弃,并被序列化为父字段。

我一直在努力弄清楚如何将对象作为一个整体来命名,以将它们链接到正确的子类。我没有得到任何结果

这是一个简单的父类和子类,我尝试序列化对象:

[JsonObject(MemberSerialization.OptIn)]
    class Product
    {
        [JsonProperty]
        public string Name { get; set; }
        [JsonProperty]
        public int Amount { get; set; }
        [JsonProperty]
        public int Value { get; set; }
    }
    [JsonObject(MemberSerialization.OptIn)]
    class ProductType : Product
    {
        [JsonProperty(Order = 4)]
        public int Volume { get; set; }
    }

序列化不是问题,volume被添加为"特殊产品"对象的最终字段。目标是生育多个孩子。下面的代码在一个列表中序列化2个创建的对象。反序列化失败,因为它将两个对象作为正常产品放回列表中:

Product test1 = new Product { Name = "Simple Product", Amount = 110, Value = 10 };
ProductType test2 = new ProductType { Name= "Special Type", Amount = 230, Value = 22, Volume = 6 };
List<Product> ProductList = new List<Product>() { test1, test2 };             
string output = JsonConvert.SerializeObject(ProductList, Formatting.Indented); //Works correctly.
List<Product> DeSerialized = JsonConvert.DeserializeObject<List<Product>>(output); //Fails creating child object.

反序列化为正确的子对象

我必须启用typename处理,并将其作为设置参数传递给序列化器和反序列化器。我被这个卡住了,因为我想在我的课上做一些类似的事情。

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
string output = JsonConvert.SerializeObject(ProductList, Formatting.Indented, settings);
List<product> deserializedList = JsonConvert.DeserializeObject<List<product>>(output, settings);

仍然应该有一个选项来序列化你想要的类,就像上面的例子一样,我不需要序列化和存储基类/父类,因为我在(反)序列化时已经给出了该类型。我也不需要序列化List对象,这尤其会造成不必要的混乱。所以,虽然这是一个解决我的问题,我正在寻找一个更好的方法来做到这一点,以下是不给错误,但似乎也不做任何事情:

[JsonObject(ItemTypeNameHandling = TypeNameHandling.Objects/all/auto/...)]
class ...