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

时间:2014-02-27 21:07:03

标签: c# serialization 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
{
    ...
}

我错过了什么吗?

3 个答案:

答案 0 :(得分:21)

是的,您缺少派生类的[DataContract]属性。如果尚未添加[DataMember],则还需要将[DataContract]添加到要序列化的任何属性或字段中。这在documentation for the DataContractAttribute class中有详细说明,如下所述(强调我的):

  

注意

     

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

Json.Net在version 5.0 release 1(2013年4月)更改为尊重此行为。

请注意,如果从类中删除所有[DataMemeber]和{{1}}的实例,则Json.Net的行为会有所不同:在这种情况下,默认行为适用于Json。 Net,用于序列化基类和派生类中的所有公共属性。

答案 1 :(得分:2)

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

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

或者,如果只希望序列化派生类的某些属性,则可以将属性[JsonProperty]添加到每个属性中(这等同于将[DataMember]和{{ 1}})。

答案 2 :(得分:-1)

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