1

我正在使用 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?

问候

克雷格。

4

1 回答 1

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 被序列化时,它们都将使用指向 MyType 的 ID 1 的“REF”属性进行序列化。

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

于 2012-04-27T13:40:19.180 回答