具有WCF和DataContractSerializer的IsReference DataContract属性

具有WCF和DataContractSerializer的IsReference DataContract属性,wcf,datacontractserializer,Wcf,Datacontractserializer,我从POCOs/EF4构建了一个相当大的对象图,我希望使用WCF将其交付给客户端应用程序。我的每件事都很好地完成了,也就是说,我有: 确保POCO使用DataContract进行修饰(IsReference=true) 使用DataMember属性修饰属性 关闭EF4数据上下文的懒散加载和代理创建 在我的LINQ查询中用于选择加载哪些关联对象 增加了WCF maxBufferSize和maxReceivedMessageSize,以确保传输大型图形 我已经构建了一个小型测试WCF控制台应用程

我从POCOs/EF4构建了一个相当大的对象图,我希望使用WCF将其交付给客户端应用程序。我的每件事都很好地完成了,也就是说,我有:

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

  • 使用DataMember属性修饰属性

  • 关闭EF4数据上下文的懒散加载和代理创建

  • 在我的LINQ查询中用于选择加载哪些关联对象

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

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

问题:许多属性在不应为空时报告为空

调查:我在不使用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>
i758
769375
本纳乌
i616
i47
i691
结论:在反序列化过程中,所有z:Ref=”“的XML条目都没有被重新构造回对象引用-因此为空

解决方法:我从PupilSet DataContract中删除了“IsReference=true”,所有操作都正常

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