继承ObservableCollection的类进行JSON序列化时,如何包含子类自身属性?
继承ObservableCollection的类进行JSON序列化时,如何包含子类自身属性?
这个问题我之前也踩过坑!你遇到的情况是因为System.Text.Json(从你用的JsonSerializer来看应该是这个序列化库)默认对集合类型的处理逻辑就是只序列化集合里的元素,会自动忽略类本身额外添加的自定义属性。给你两个实用的解决办法:
方法一:用序列化特性显式指定要序列化的成员
通过给你的TestClass标记[JsonObject(MemberSerialization.OptIn)],告诉序列化器“我要手动指定哪些成员需要被序列化”,然后给每个要保留的属性(包括集合本身)加上[JsonProperty]特性:
using System.Text.Json.Serialization; using System.Collections.ObjectModel; [JsonObject(MemberSerialization.OptIn)] public class TestClass : ObservableCollection<object> { public TestClass() { Items.Add(new TestObject()); } [JsonProperty] public string Name { get; set; } [JsonProperty] public double Size { get; set; } [JsonProperty] public new IList<object> Items => base.Items; } public class TestObject { public string ObjectName { get; set; } public double ObjectSize { get; set; } }
这样序列化后,你就能得到包含Name、Size和集合元素的JSON结构了。
方法二:用组合代替继承(更推荐)
其实从面向对象设计的角度来说,组合优于继承。你可以把ObservableCollection作为TestClass的一个公共属性,而不是直接继承它。这样序列化器会默认序列化所有公共属性,完全不需要额外配置:
using System.Collections.ObjectModel; public class TestClass { public TestClass() { Items = new ObservableCollection<object>(); Items.Add(new TestObject()); } public string Name { get; set; } public double Size { get; set; } public ObservableCollection<object> Items { get; set; } } public class TestObject { public string ObjectName { get; set; } public double ObjectSize { get; set; } }
这种方式序列化出来的JSON会是这样的,完全符合你的需求:
{ "Name": null, "Size": 0, "Items": [ { "ObjectName": null, "ObjectSize": 0 } ] }
两种方法各有适用场景:如果你的业务逻辑必须让TestClass直接作为集合使用(比如需要直接调用集合的方法),可以用第一种;如果没有这个强制要求,第二种方法代码更清晰,也更符合设计原则,优先推荐。
备注:内容来源于stack exchange,提问作者mmdn
相关产品推荐
相关产品推荐

