有没有办法告诉WCF在返回时序列化整个类?我是否真的必须将DataMember添加到每个属性?
从.NET 3.5 SP1开始,您不必再这样做了。
如果您没有任何[DataContract]
和[DataMember]
属性,DataContractSerializer类的行为将类似于旧的XmlSerializer:它将序列化类中列出的所有公共读/写属性。
但是你在这个过程中失去了一些东西:
[DataMember]
属性,你不能再定义字段的顺序 - 它们将按照外观的顺序被序列化[DataMember]
)Required
(那将再次出现在[DataMember]
属性上)阅读Pluralsight的Aaron Skonnard的all about it in detail。
我喜欢marc的答案,但我想补充更多信息。
DataContractSerializer和DataContractJsonSerializer也支持开箱即用的许多其他序列化模型。这包括IXmlSerializable,Serializable和ISerializable。在.NET 3.5 SP1中添加了POCO支持,但自.NET 3以来,对这些其他模型的支持一直存在
This blog post详细说明了支持的范围,更重要的是,序列化器对不同模型的优先级排序(即,如果你有一个用多个序列化模型装饰的类型,它会告诉你基于DataContract的序列化器会做什么)
因此,如果您阅读该博客文章,您会注意到POCO支持位于优先级列表的最后。如果类型或其父级上绝对没有其他可用的序列化编程模型,那么它就是序列化程序的最后手段。例如,如果类型是某种类型的可枚举,它将根据traditional collection rules进行序列化。如果它是ISerializable或Serializable,它将根据它们的序列化规则进行序列化。
另一个重要区别:在所有其他类型的反序列化期间,永远不会调用默认的零参数构造函数。对于POCO类型,它总是被称为!这为您提供了其他序列化模型中没有的附加钩子!