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只为我返回{}。 我发现在正确序列化之前我需要在类中添加一个新的构造函数。