我有一个类ClassA
,它有一个属性,其中包含ClassB
类型,其字段类型为ClassA
。当我尝试通过WCF序列化时,由于其递归性质,我得到了一个异常。解决方案是将IsReference=true
添加到ClassA
的数据协定定义中。
这很棒,除非我的ClassA
成员标有DataMember(IsRequired=true)
属性,一旦我添加了IsReference=true
,就抱怨事情不能同时为{{1}并且拥有IsReference=true
的成员。
我无法理解为什么会这样,我想知道是否有解决方法?
我想声明我的数据库,以便它们在xml中需要?
我已经看过this post,但答案仍然不明确。如果我想阻止发出默认值,那么我可以在IsRequired = true旁边使用EmitDefaultValues = false(这也是我想要做的)。还有另一种解决方法吗?
答案 0 :(得分:0)
考虑反序列化方案。你有一堆DataContractSerializer正在读取的XML。想象一下你正在处理类型Foo,它被标记为IsReference = true和IsRequired = true。
序列化程序遇到类型为Foo的字段foo1。现在,这意味着XML可以说类似于以下内容:
<foo1 ref="1" /?
序列化程序会将foo1反序列化为null,但请记住它引用了一个它还没有的对象。序列化程序继续反序列化剩余的字段。最终,它遇到了下面的另一个领域。啊啊,它看到了前面提到的foo1的对象 - ID为1的对象。
<foo2 id="1"> <datamember1> ... </datamember1> <datamember2> ... </datamember2> </foo2>
当遇到id =“1”时,序列化程序返回并修复foo1指向foo2。
然而,foo2可能永远不存在。换句话说,foo1可能引用了XML中不存在的其他ID。在完全反序列化图表的其余部分之前,序列化程序无法确定这一点。
我希望你开始看到这个问题。如果类型同时是IsReference和IsReequired,则序列化保证不再可能在反序列化期间遵循该类型的IsRequired性质。如果所需元素不存在,它就不能再快速失败,因为它无法确定它是否存在。