gpt4 book ai didi

c# - 反序列化为正确的子对象

转载 作者:行者123 更新时间:2023-11-30 17:00:16 25 4
gpt4 key购买 nike

我正在尝试将父项和不同子项的混合反序列化为 List<parent> .不幸的是,我的 child 的所有额外字段都被丢弃并被序列化为 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; }
}

序列化不是问题,体积被添加为“特殊产品”对象的最终字段。目标是生多个 child 。在序列化列表中 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.

最佳答案

我必须启用类型名处理并将其作为设置参数传递给序列化器和反序列化器。我一直坚持这个,因为我试图在我的类里面做这样的事情。

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

关于c# - 反序列化为正确的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22465868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com