C# 数据合同秘密行为?

C# 数据合同秘密行为?,c#,serialization,deserialization,datacontract,C#,Serialization,Deserialization,Datacontract,每次我遇到这个属性,我总是看到这样的用法: [DataContract] class DataTransferObject { [DataMember] public int Value {get;set;} } 在本例中,所有继承的成员都应该将DataMember属性应用于每个属性或字段,这可能会导致代码非常笨拙。但是,最近我发现(可能是秘密功能?)一种非常优雅的使用方式: [DataContract] public abstract class DTOBase { } p

每次我遇到这个属性,我总是看到这样的用法:

[DataContract]
class DataTransferObject
{
    [DataMember]
    public int Value {get;set;}
}
在本例中,所有继承的成员都应该将DataMember属性应用于每个属性或字段,这可能会导致代码非常笨拙。但是,最近我发现(可能是秘密功能?)一种非常优雅的使用方式:

[DataContract]
public abstract class DTOBase
{
}

public class MyDTO : DTOBase
{
    public int Value {get;set;}

    public MyDTO(){} //important part is here
}
重要部分:您应该始终明确定义无参数构造函数,否则它将无法正确序列化

是的。它序列化其所有公共成员,不管继承有多深,而无需将属性应用于成员或类定义


这是不是在什么地方被记录下来的(我没有找到)?因为,我非常感谢可以避免多少样板文件。

实际上,如果您不想,您不需要使用
DataContract
DataMember
属性,但是它们为您提供了定义需要序列化的内容和方式的灵活性

我建议从这篇文章开始,它有很多关于数据契约序列化程序如何工作的信息。以下是前两段,证明您不需要使用属性:

默认情况下,DataContractSerializer序列化所有公开可见的 类型

此类型的所有公共读/写属性和字段都是 连载。可以通过应用 类型的DataContractAttribute和DataMemberAttribute属性 成员们,此功能在您遇到以下情况时非常有用: 不受您控制且无法修改以添加的类型 属性。DataContractSerializer识别这样的“未标记” 类型

适用于您的案例的主要规则有:

  • DataContract
    属性未被继承。您可以在基类
    DTOBase
    上应用或不应用它,它在子类
    MyDTO
    中被忽略。您可以从
    DTOBase
    类中删除
    DataContract
    属性,结果将相同
  • 如果对类使用
    DataContract
    属性,则只有具有
    DataMember
    属性的成员才会被序列化。这是您的第一个示例中在类
    DataTransferObject
    中发生的情况
  • 如果不在类上使用
    DataContract
    属性,则将序列化类的所有公共成员。这就是您的类
    MyDTO
    发生的情况