.net DataContractSerializer: как обрабатывать рекурсивные структуры данных? - PullRequest
1 голос
/ 19 апреля 2011

Если у меня есть класс с рекурсивной структурой данных, такой как

  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 ]

2 голосов
/ 19 апреля 2011

эта настройка работает

     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 голос
/ 19 апреля 2011

Вы можете использовать

<readerQuotas maxDepth="n" />

для определения глубины сериализации. Но это вызовет исключение, если у вас более высокая рекурсия.

...