我使用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?
此致
克雷格。
答案 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调用中被序列化。