我正在使用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
{
...
}
我错过了什么吗?
答案 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只为我返回{}。我发现在正确序列化之前我需要在类中添加一个新的构造函数。