【问题标题】:.net DataContractSerializer: how to handle recursive data structures?.net DataContractSerializer:如何处理递归数据结构?
【发布时间】:2011-08-08 12:25:33
【问题描述】:

如果我有一个具有像这样的递归数据结构的类

  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 而没有冗余?

【问题讨论】:

    标签: .net recursion serialization data-structures datacontractserializer


    【解决方案1】:

    此设置似乎有效

         DataContractSerializer ds = new DataContractSerializer(objectToSave.GetType(), 
                                         null, 20000, true, true, null);
    

    结果

        <MyNamespace.Test ...>
          <Name z:Id="2">Parent</Name>
          <Recursion z:Ref="1" i:nil="true" />
        </MyNamespace.Test>
    

    【讨论】:

      【解决方案2】:

      你可以使用

      <readerQuotas maxDepth="n" />
      

      定义序列化的深度。但是如果你有更高的递归,这会抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2015-04-26
        • 2018-08-27
        • 2017-08-06
        相关资源
        最近更新 更多