C# json.net不会序列化派生类的属性
我使用的是JSON.NET6.0.1。当我使用C# json.net不会序列化派生类的属性,c#,serialization,json.net,C#,Serialization,Json.net,我使用的是JSON.NET6.0.1。当我使用SerializeObject方法序列化派生类的对象时,它只序列化基类的属性。以下是代码片段: string v = JsonConvert.SerializeObject( service, Formatting.Indented, new JsonSerializerSettings() {
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]
。Json.Net在(2013年4月)进行了更改,因此[DataContract]
属性不会被继承
请注意,如果从类中删除
[DataContract]
和[DataMemeber]
的所有实例,Json.Net的行为会有所不同:在这种情况下,默认行为是Json.Net序列化所有公共属性,包括基类和派生类。[Table(Name = "dbo.mytable")]
[JsonObject(MemberSerialization.OptOut)]
public sealed class mytable : DataEntity
{
...
}
或者,如果您只想序列化派生类的某些属性,则可以向每个属性添加属性
[JsonProperty]
(这相当于将[DataMember]
与类上的[DataContract]
一起添加到每个属性).是否有任何方法可以更改此行为?@JoelFan您必须更加具体。我希望能够告诉JsonConvert.SerializeObject序列化所有属性,而不考虑任何属性。我有一个从标记为[DataContract]的类派生的类,但我的派生类没有标记。结果,只有基类的属性被序列化。@JoelFan-See@JoãoPortela我删除了引号,因为它似乎给人们带来了混乱。没有它,答案仍然有用。太棒了@Ray,谢谢!我不明白为什么did不是被接受/投票最多的答案,因为在网络上,TypeNameHandling.都会带来安全问题。请注意,如果您的派生类是内部的,就像我的一样,[JsonObject(MemberSerialization.OptOut)]将无法工作。您必须对每个基类成员使用[JsonProperty]。不过效果很好!