在IXmlSerializable中查找引用

时间:2010-01-07 09:09:11

标签: c# ixmlserializable

我使用IXmlSerializable将特定类型的元素写入传出的xml。 我已经实现了模式,并且正在编写项目。下面的代码就是一个例子。

public void IXmlSerializable.WriteXml(XmlWriter writer) {
  // Write Out Class.
  foreach (var item in myItems) {
    DataContractSerializer ds = new DataContractSerializer(typeof(MyType));
    ds.WriteObject(writer, item);
  }
}

我遇到的问题是MyType被声明为使用引用

[DataContract(IsReference = true)]
public class MyType { ...

因此,当项目已经写入xml时,它需要是一个引用。

如何知道引用是否已写入xml? 我认为我必须忽略我明确无法控制的引用。这样我就可以编写自己的引用ID并引用我自己的实例。

这显然是一个糟糕的黑客攻击,因为我复制了不应该重复的引用。

有没有办法找出已编写的内容,看看我是否可以找到已经序列化的项目的ID?

此致

克雷格。

1 个答案:

答案 0 :(得分:0)

“IsReference”魔法仅适用于单个“剧集”中的序列化。剧集是单个WriteObject调用。

假设你有一个顶级类型的顶级对象,如下所示:

[DC]    
class Container
    {
      [DM]
      MyType i1 = new MyType();
      [DM]
      MyType i2 = i1;;
      [DM]
      MyType i3 = i1;
    }

现在,如果你通过调用WriteObject来序列化Container的一个实例,那就是“ids”和“refs”发挥作用的时候。当i1被序列化时,它将被序列化为ID为1,但是当i2和i3被序列化时,它们每个都被序列化,其中“REF”属性指向MyType的ID 1。

在您的示例中,因为每次调用WriteObject都是一个单独的剧集,所以每次调用都会序列化整个对象图。除非您可以将所有不同的MyType实例打包到更高级别的对象(甚至是集合),否则您将失去运气。这就是你需要做的 - 基本上强制所有MyType实例在一个更高级别的WriteObject调用中被序列化。