【问题标题】:Deserialize into correct child objects反序列化为正确的子对象
【发布时间】:2014-03-17 21:31:44
【问题描述】:

我正在尝试将父母和不同孩子的混合反序列化为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.

【问题讨论】:

标签: c# json serialization json.net


【解决方案1】:

我必须启用类型名处理并将其作为设置参数传递给序列化器和反序列化器。我被困在这个问题上,因为我试图在我的课堂上做这样的事情。

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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多