我使用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?
问候
克雷格。
发布于 2012-04-27 21:40:19
"IsReference“的魔力只适用于单个”剧集“中的序列化。一个插曲就是一个单独的WriteObject调用。
假设你有一个顶层类型的顶层对象,如下所示:
[DC]
class Container
{
[DM]
MyType i1 = new MyType();
[DM]
MyType i2 = i1;;
[DM]
MyType i3 = i1;
}现在,如果您要通过调用WriteObject来序列化容器的实例,那么“is”和"refs“就开始起作用了。当i1被序列化时,它将被序列化,ID为1,但是当i2和i3被序列化时,它们都被序列化,"REF“属性指向MyType的ID 1。
在您的示例中,因为每个对WriteObject的调用都是一个单独的片段,所以每个调用都将序列化整个对象图。除非您能够将所有不同的MyType实例打包到一个更高级别的对象(甚至是集合)中,否则您就不走运了。这就是您需要做的--本质上是强制在单个更高级别的WriteObject调用中序列化所有MyType实例。
https://stackoverflow.com/questions/2019224
复制相似问题