【发布时间】:2009-06-24 08:57:28
【问题描述】:
DataContract 中的IsReference 属性的用途是什么?应用此属性后,请求和响应有何不同?
【问题讨论】:
标签: wcf datacontract
DataContract 中的IsReference 属性的用途是什么?应用此属性后,请求和响应有何不同?
【问题讨论】:
标签: wcf datacontract
它决定了对象的序列化方式,默认为IsReference=false。
设置IsReference = true 允许序列化可以相互引用的对象树。因此,对于每个具有Manager 属性的Employees 列表(也是Employee),可以保留对每个Employee 的Manager 的引用,而不是将Manager 嵌入其中每个Employee节点:
IsReference=false 会产生:
<Employee>
<Manager i:nil=“true“ />
<Name>Kenny</Name>
</Employee>
<Employee>
<Manager>
<Manager i:nil=“true“ />
<Name>Kenny</Name>
</Manager>
<Name>Bob</Name>
</Employee>
<Employee>
<Manager>
<Manager i:nil=“true“ />
<Name>Kenny</Name>
</Manager>
<Name>Alice</Name>
</Employee>
IsReference=true 会产生:
<Employee z:Id=“i1“ xmlns:z=“http://schemas.microsoft.com/2003/10/Serialization/“>
<Manager i:nil=“true“ />
<Name>Kenny</Name>
</Employee>
<Employee z:Id=“i2“ xmlns:z=“http://schemas.microsoft.com/2003/10/Serialization/“>
<Manager z:Ref=“i1“ />
<Name>Bob</Name>
</Employee>
<Employee z:Id=“i3“ xmlns:z=“http://schemas.microsoft.com/2003/10/Serialization/“>
<Manager z:Ref=“i1“ />
<Name>Alice</Name>
</Employee>
摘自此weblog 的片段,其中包含完整说明以及应用属性的生成 XML 示例。
MSDN - IsReference Property 提供详细信息以及 Interoperable Object References。
【讨论】:
另外,IsReference 在 .NET Framework 3.5 中不存在。因此,在与该框架版本一起使用时可能会出现错误 - 它仅存在于 4.5、4、3.5 SP1 和 Silverlight 中。
“错误 297 'System.Runtime.Serialization.DataContractAttribute' 不包含 'IsReference' 的定义”
【讨论】: