json.net不会从派生类序列化属性

fro*_*sty 17 c# serialization json.net

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

string v = JsonConvert.SerializeObject(
                service, 
                Formatting.Indented, 
                new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                });
Run Code Online (Sandbox Code Playgroud)

基类:

[DataContract]
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

派生类:

[Table(Name = "dbo.mytable")]
public sealed class mytable : DataEntity
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Bri*_*ers 24

是的,您缺少[DataContract]派生类的属性.[DataMember]如果尚未添加序列化,还需要添加到要序列化的任何属性或字段.这DataContractAttribute课程文档中有详细说明,如下所述(强调我的):

注意

数据协定与其继承行为中的实际接口有很大不同.接口由任何派生类型继承.将DataContractAttribute应用于基类时,派生类型不会继承属性或行为.但是,如果派生类型具有数据协定,则基类的数据成员将被序列化.但是,必须将DataMemberAttribute应用于派生类中的新成员才能使其可序列化.

Json.Net在版本5.0发行版1(2013年4月)中更改为遵循此行为.

请注意,如果您删除的所有实例[DataContract],并[DataMemeber]从你的类,Json.Net表现不同:在这种情况下,默认行为是Json.Net连载所有的公共属性,无论是在基类和派生类.