微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.net DataContractSerializer:如何处理递归数据结构?

如何解决.net DataContractSerializer:如何处理递归数据结构?

| 如果我有一个像这样的递归数据结构的类
  public class Test
  {
     public string Name { get; set; }
     public Test Recursion { get; set; }
  }
并序列化它
     var objectToSave= new Test{Name=\"Parent\"};
     objectToSave.Recursion = test; // this is an endless recursion

     DataContractSerializer ds = new DataContractSerializer(objectToSave.GetType());

     XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
     using (XmlWriter w = XmlWriter.Create(\"result.xml\",settings))
        ds.WriteObject(w,objectToSave);
我得到
    <?xml version=\"1.0\" encoding=\"utf-8\"?>
    <MyNamespace.Test ...>
      <Name>Parent</Name>
      <Recursion>
        <Name>Parent</Name>
        <Recursion>
          <Name>Parent</Name>
          <Recursion>
            <Name>Parent</Name>
            <Recursion>
           ...... togehter 1586 lines
更新: 有一个参数MaxItemsInObjectGraph可以限制输出。 有人知道如何为此找到好的价值吗? 还是有一种方法可以告诉序列化程序应该进行多深的递归,或者获得没有冗余的更紧凑的xml?

解决方法

此设置似乎有效
     DataContractSerializer ds = new DataContractSerializer(objectToSave.GetType(),null,20000,true,null);
结果
    <MyNamespace.Test ...>
      <Name z:Id=\"2\">Parent</Name>
      <Recursion z:Ref=\"1\" i:nil=\"true\" />
    </MyNamespace.Test>
,您可以使用
<readerQuotas maxDepth=\"n\" />
定义深度序列化的程度。但是,如果您具有更高的递归,则会抛出异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。