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

时间:2011-04-19 09:13:03

标签: .net recursion serialization data-structures 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?

2 个答案:

答案 0 :(得分:2)

此设置似乎有效

     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>

答案 1 :(得分:1)

您可以使用

<readerQuotas maxDepth="n" />

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