首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContracts和DataMembers

DataContracts和DataMembers
EN

Stack Overflow用户
提问于 2011-04-16 04:10:02
回答 2查看 5.3K关注 0票数 14

有什么方法可以让WCF在返回时序列化整个类吗?我真的需要在每个属性中都添加DataMember吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-16 04:12:23

从.NET 3.5 SP1开始,你不再需要这样做了。

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

不过,在这个过程中,您确实会丢失一些东西:

  • 由于您没有[DataMember]属性,因此不能再定义字段的顺序-它们将按出现的顺序序列化
  • 您不能省略公共属性(因为这将要求所有其他properties/fields)
  • you上的[DataMember]不能将属性定义为Required (这将再次出现在[DataMember]属性上)
  • 您的类现在需要有一个公共的、无参数的构造函数(通常不需要用于数据协定)

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

票数 28
EN

Stack Overflow用户

发布于 2011-04-17 06:02:00

我喜欢marc的回答,但我想补充一些信息。

DataContractSerializer和DataContractJsonSerializer都支持开箱即用的许多其他序列化模型。这包括IXmlSerializable、Serializable和ISerializable。.NET 3.5 SP1中添加了对.NET的支持,但从POCO 3开始就一直支持这些其他型号

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

所以,如果你读了这篇博文,你会注意到POCO支持在优先级列表中排在最后。如果该类型或其父级上绝对没有其他序列化编程模型可用,则它是序列化程序的最后手段。例如,如果类型是某种类型的可枚举类型,它将根据traditional collection rules被序列化。如果它是ISerializable或Serializable,它将根据它们的序列化规则进行序列化。

另一个重要的区别是:在所有其他类型的反序列化过程中,从不调用默认的零参数构造函数。对于POCO类型,它总是被调用!这给了你一个额外的钩子,这是其他序列化模型中不容易做到的!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5681842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档