DataContractSerializer是一个选择性序列化器。 如何让它退出?

我inheritance了一些具有大量属性的类。 我希望能够为WCF序列化它们。

由于DataContractSerializer是一个选择性序列化器,我需要使用DataMember属性来装饰所有属性,这在我看来有点麻烦。 我没有任何其他方法,所以我不必将DataMember添加到所有属性?

请注意,我的大部分属性都需要序列化。

您不能使用任何常见的序列化属性(即[DataContract] / [Serializable] )标记您的类,并确保您要序列化的所有属性都是公共getset 。 如果要排除某个属性,则需要使用[IgnoreDataMember]属性对其进行标记。

例:

 public class Hamster { public string Name { get; set; } [IgnoreDataMember] public int Age { get; set; } } 

来自MSDN上的Serializable Types :

您可以应用DataContractAttribute和DataMemberAttribute属性…但是,即使未标记这些属性的类型也会被序列化和反序列化。 以下规则和例外适用:……
除非将IgnoreDataMemberAttribute属性应用于该成员,否则将序列化所有公共字段以及具有公共get和set方法的属性。

这取决于您的属性是否可以自动生成 – 如果是这样,您可以简单地替换WCF序列化程序。 通常这样做是为了使用JSON.NET:

C#WCF REST – 如何使用JSON.Net序列化程序而不是默认的DataContractSerializer?

这就是它在MSDN链接上的设计方式。 另一种方法是使用XmlSerializer来序列化所有公共字段/属性。 最后,考虑到DataContractSerializer与另一种方法,你必须权衡利弊。

dotnet 4.0及以上版本开始,

您可以避免[DataContract]属性使所有public成员可serializable