【问题标题】:json.net does not serialize properties from derived classjson.net 不序列化派生类的属性
【发布时间】:2014-03-31 13:59:42
【问题描述】:

我正在使用 JSON.NET 6.0.1。当我使用SerializeObject 方法序列化派生类的对象时,它仅序列化基类的属性。这是代码sn-p:

string v = JsonConvert.SerializeObject(
                service, 
                Formatting.Indented, 
                new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                });

基类:

[DataContract]
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged
{
    ...
}

派生类:

[Table(Name = "dbo.mytable")]
public sealed class mytable : DataEntity
{
    ...
}

我错过了什么吗?

【问题讨论】:

    标签: c# serialization json.net


    【解决方案1】:

    是的,您缺少派生类的[DataContract] 属性。您还需要将[DataMember] 添加到您想要序列化的任何属性或字段(如果您尚未添加它们)。 Json.Net 在 version 5.0 release 1(2013 年 4 月)中进行了更改,因此不会继承 [DataContract] 属性。

    请注意,如果您删除所有 [DataContract][DataMemeber] 从您的类中,Json.Net 的行为会有所不同:在这种情况下,默认行为是 Json.Net 序列化所有基类和派生类中的公共属性。

    【讨论】:

    • 有什么办法可以改变这种行为吗?
    • @JoelFan 你必须更具体。
    • 我希望能够告诉 JsonConvert.SerializeObject 序列化所有属性,而不考虑任何属性。我有一个派生自标记为 [DataContract] 的类,但我的派生类没有标记。结果,只有基类的属性被序列化。
    • @JoãoPortela 我已经删除了这句话,因为它似乎会引起人们的困惑。没有它,答案仍然有用。
    【解决方案2】:

    将属性[JsonObject(MemberSerialization.OptOut)] 添加到派生类将包括其所有要序列化的公共成员。

    [Table(Name = "dbo.mytable")]
    [JsonObject(MemberSerialization.OptOut)]
    public sealed class mytable : DataEntity
    {
        ...
    }
    

    或者,如果您只想序列化派生类的某些属性,您可以将属性 [JsonProperty] 添加到每个属性(这相当于将 [DataMember] 添加到每个属性以及类上的 [DataContract] )。

    【讨论】:

    • 很棒的@Ray,谢谢!我不明白为什么 did 不是被接受/最受好评的答案,因为 TypeNameHandling.All 带来了安全问题的网络评论很好。顺便说一句,如果您的派生类是内部的,就像我的一样,[JsonObject(MemberSerialization.OptOut)] 将不起作用。您必须在每个基类成员上使用 [JsonProperty]。不过效果很好!
    【解决方案3】:

    JsonConvert.SerializeObject 只是为我返回 {}。我发现我需要在类正确序列化之前添加一个新的构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多