IsReference DataContract属性与WCF和DataContractSerializer

时间:2011-07-22 16:27:32

标签: wcf datacontractserializer

我有一个相当大的POCO / EF4对象图构建,我希望使用WCF提供给客户端应用程序。我很满意,工作得很好,即我有:

  • 确保POCO装饰有 DataContract(IsReference = true)

  • 使用 DataMember 属性

  • 修饰属性
  • 关闭了EF4数据上下文的 LazyLoading 代理创建

  • 在我的LINQ查询中使用EagerLoading来选择加载了哪些关联对象

  • 增加了WCF maxBufferSize和maxReceivedMessageSize以确保传输大图

我构建了一个小型测试WCF控制台应用程序,它执行服务方法并接收对象图。然后,应用程序遍历图形并打印出图形中各种对象的属性。

问题:许多属性在不应该

时报告为null

调查:我在不使用WCF服务的情况下直接针对EF4 datacontext测试了相同的查询,并且图形没有对关联对象的空对象引用。

进一步研究:我使用WCF服务跟踪工具来检查通过网络传输的XML,一切都很好,即IsReference属性确保引用对象在XML中正确编码,如同下面的“PupilSet”集合:

<d4p1:Type></d4p1:Type>i758</d4p1:Personal>
<d4p1:PupilId>769375</d4p1:PupilId>
<d4p1:RollNo>BENNAW</d4p1:RollNo>
<d4p1:Sets>
<d4p1:PupilSet z:Ref="">i616</d4p1:PupilSet>
<d4p1:PupilSet z:Ref="">i47</d4p1:PupilSet>
<d4p1:PupilSet z:Ref="">i691</d4p1:PupilSet>

结论:在反序列化期间,所有带有z:Ref =“”的XML条目都没有被重新构造回对象引用 - 因此为null。

解决方法:我从 PupilSet DataContract中删除了“IsReference = true”并且一切正常

问题:什么时候使用“IsReference = true”?为什么DataContractSerializer无法使用正确的对象引用而不是null来反序列化XML?

1 个答案:

答案 0 :(得分:0)

如果您仍然有兴趣知道它是如何运作的,我建议您阅读IsReference property讨论中找到的帖子this