数据合同和数据成员

Posted

技术标签:

【中文标题】数据合同和数据成员【英文标题】:DataContracts and DataMembers 【发布时间】:2011-08-06 14:43:22 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

由于您没有 [DataMember] 属性,您无法再定义字段的顺序 - 它们将按出现的顺序进行序列化

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

您不能将属性定义为Required(这将再次出现在[DataMember] 属性上)

您的类现在需要有一个公共的、无参数的构造函数(数据协定通常不需要)

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

【讨论】:

@razlebe:微软屈服于成群的懒惰程序员的抱怨 :-)(至少 Juval Lowy 是这么说的)【参考方案2】:

我喜欢马克的回答,但我想添加更多信息。

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

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

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

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

【讨论】:

博客链接失效。 链接重定向现在工作。新链接:blogs.msdn.microsoft.com/sowmy/2006/02/22/…

以上是关于数据合同和数据成员的主要内容,如果未能解决你的问题,请参考以下文章

WCF - 使用完全相同的数据合同的多个服务合同

火眼审阅 | 基于NLP和OCR识别技术赋能合同审阅

电子合同数据全流程实时上链存证,君子签打造数据证据链闭环

一款数据加密共享与签名方案

六祎-mysql购销合同和报运单的数据库设计

WCF 数据合同