json.net不会从派生类序列化属性
我正在使用JSON.NET 6.0.1。 当我使用SerializeObject
方法序列化派生类的对象时,它仅从基类序列化属性。 这是代码片段:
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 { ... }
我错过了什么吗?
是的,您缺少派生类的[DataContract]
属性。 如果尚未添加[DataMember]
,还需要将[DataMember]
添加到要序列化的任何属性或字段中。 这在DataContractAttribute
类的文档中有详细说明,如下所述(强调我的):
注意
数据协定与其inheritance行为中的实际接口有很大不同。 接口由任何派生类型inheritance。 将DataContractAttribute应用于基类时,派生类型不会inheritance属性或行为。 但是,如果派生类型具有数据协定,则基类的数据成员将被序列化。 但是,必须将DataMemberAttribute应用于派生类中的新成员才能使其可序列化。
Json.Net在版本5.0发行版1 (2013年4月)中更改为遵循此行为。
请注意,如果从类中删除 [DataContract]
和[DataMemeber]
所有实例,Json.Net的行为会有所不同:在这种情况下,默认行为是Json.Net序列化所有公共属性,包括基类和派生类。
将属性[JsonObject(MemberSerialization.OptOut)]
到派生类将包括要序列化的所有公共成员。
[Table(Name = "dbo.mytable")] [JsonObject(MemberSerialization.OptOut)] public sealed class mytable : DataEntity { ... }
或者,如果您只希望序列化派生类的某些属性,则可以将属性[JsonProperty]
添加到每个属性中(这相当于将[DataMember]
添加到每个属性以及类上的[DataContract]
)。
JsonConvert.SerializeObject只为我返回{}。 我发现在正确序列化之前我需要在类中添加一个新的构造函数。