首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在IXmlSerializable中查找引用

在IXmlSerializable中查找引用
EN

Stack Overflow用户
提问于 2010-01-07 17:09:11
回答 1查看 140关注 0票数 1

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

代码语言:javascript
复制
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被声明为使用引用

代码语言:javascript
复制
[DataContract(IsReference = true)]
public class MyType { ...

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

如何知道引用是否已写入xml?我的观点是,我必须忽略那些我显然无法控制的引用。这样我就可以创建我自己的引用id并引用我自己的实例。

这显然是一个糟糕的黑客妥协,因为我正在复制不应该复制的引用。

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

问候

克雷格。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-27 21:40:19

"IsReference“的魔力只适用于单个”剧集“中的序列化。一个插曲就是一个单独的WriteObject调用。

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

代码语言:javascript
复制
[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实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2019224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档