有没有办法告诉WCF在返回时序列化整个类?我真的必须将DataMember添加到每个属性吗?
答案 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类型,它总是被称为!这为您提供了一个额外的钩子,您可以在其他序列化模型中轻松使用它!