2

我有一个类,ClassA它有一个包含类型的属性,其中有一个类型的ClassB字段ClassA。当我尝试通过 WCF 序列化它时,由于它的递归性质,我得到了一个异常。解决方案是添加IsReference=trueClassA.

这很好,除了我的成员ClassA标有DataMember(IsRequired=true)属性,一旦我添加了IsReference=true它,它就会抱怨事情不能两者兼有IsReference=true,并且成员是IsRequired=true.

我不明白为什么会这样,我想知道是否有解决方法?

我想声明我的数据成员,以便它们在 xml 中需要?

我已经看过这篇文章,但我仍然不清楚答案。如果我想阻止发出默认值,那么我可以在 IsRequired=true 旁边使用 EmitDefaultValues=false (这就是我想要做的)。还有另一种解决方法吗?

4

1 回答 1

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 特性。如果所需的元素不存在,它就不能再快速失败,因为它不能确定它是否存在。

于 2011-04-16T04:04:58.797 回答