You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:45:30