首页 文章

IsReference DataContract属性与WCF和DataContractSerializer

提问于
浏览
3

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

  • 确保POCO用DataContract修饰(IsReference = true)

  • 使用DataMember属性修饰属性

  • 关闭了EF4数据上下文的LazyLoading和Proxy创建

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

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

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

Problem :许多属性在不应该被报告为null时

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

Further Investigation :我使用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>

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

Workaround :我从PupilSet DataContract中删除了"IsReference=true",一切正常

Question :什么时候适合使用"IsReference=true"?为什么DataContractSerializer无法使用正确的对象引用而不是null来反序列化XML?

1 回答

  • 0

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

相关问题