我正在尝试将父级和不同子级的混合反序列化为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; }
}
序列化不是问题,卷被添加为“特殊产品”对象的最终字段。目标是拥有多个孩子。在列表中序列化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.
答案 0 :(得分:2)
我必须启用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);
仍然应该有一个选项来序列化你想要的类,如上例所示我不需要序列化和存储基类/父类,因为我已经在(de)序列化时给出了该类型。我也不需要序列化List对象,这尤其会带来不必要的混乱。因此,虽然这是我的问题的解决方案,我正在寻找一个更好的方法来做到这一点,以下是不会给出错误,但似乎也没有做任何事情:
[JsonObject(ItemTypeNameHandling = TypeNameHandling.Objects/all/auto/...)]
class ...