数据合同和数据成员

问题描述 投票:13回答:2

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

wcf datacontractserializer
2个回答
24
投票

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

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

但是你在这个过程中失去了一些东西:

  • 由于你没有[DataMember]属性,你不能再定义字段的顺序 - 它们将按照外观的顺序被序列化
  • 你不能省略公共财产(因为那将需要所有其他财产/领域的[DataMember]
  • 你不能将属性定义为Required(那将再次出现在[DataMember]属性上)
  • 你的类现在需要一个公共的,无参数的构造函数(通常不需要数据契约)

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


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类型,它总是被称为!这为您提供了其他序列化模型中没有的附加钩子!

© www.soinside.com 2019 - 2024. All rights reserved.