C# json.net不会序列化派生类的属性

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() {

我使用的是JSON.NET6.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]
。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]。不过效果很好!