DataContract和数据成员

时间:2011-04-15 20:10:02

标签: wcf datacontractserializer

有没有办法告诉WCF在返回时序列化整个类?我真的必须将DataMember添加到每个属性吗?

2 个答案:

答案 0 :(得分:24)

从.NET 3.5 SP1开始,您不必再这样做了。

如果您没有任何[DataContract][DataMember]属性,DataContractSerializer类的行为将类似于旧的XmlSerializer:它将序列化类中列出的所有公共读/写属性。 / p>

你在这个过程中确实失去了一些东西:

  • 由于您没有[DataMember]属性,因此无法再定义字段的顺序 - 它们将按照外观的顺序进行序列化

  • 您不能省略公共财产(因为在所有其他财产/字段上需要[DataMember]

  • 您无法将属性定义为Required(将再次位于[DataMember]属性上)

  • 您的班级现在需要一个公共的无参数构造函数(通常不需要数据合同)

阅读Pluralight的Aaron Skonnard的all about it in detail

答案 1 :(得分:3)

我喜欢marc的回答,但我想补充更多信息。

DataContractSerializer和DataContractJsonSerializer也支持开箱即用的许多其他序列化模型。这包括IXmlSerializable,Serializable和ISerializable。在.NET 3.5 SP1中添加了POCO支持,但自.NET 3以来一直支持这些其他模型

This blog post详细说明了支持程度,更重要的是,序列化程序对不同模型的优先级排序(即,如果您有一个用多个序列化模型修饰的类型,它会告诉您基于DataContract的序列化程序会做什么)

因此,如果您阅读该博客文章,您会注意到POCO支持位于优先级列表的最后。如果在类型的父类型上绝对没有其他序列化编程模型可用,那么它就是序列化程序的最后手段。例如,如果类型是某种类型的可枚举,它将根据traditional collection rules进行序列化。如果它是ISerializable或Serializable,它将根据它们的序列化规则进行序列化。

另一个重要区别:在所有其他类型的反序列化期间,永远不会调用默认的零参数构造函数。对于POCO类型,它总是被称为!这为您提供了一个额外的钩子,您可以在其他序列化模型中轻松使用它!