Узлы дублирования объектов сериализации - PullRequest
1 голос
/ 01 ноября 2009

Может кто-нибудь сказать мне, почему мой вывод дублирует «FirstNode»?

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main(string[] args)
    {
        Root root = new Root();
        FirstNode firstNode = new FirstNode();
        firstNode.Data = "DATA";

        root.FirstNode.Add(firstNode);

        XmlSerializer s = new XmlSerializer(typeof(Root));
        StringWriter sw = new StringWriter();
        s.Serialize(sw, root);
        string serializedXml = sw.ToString();
        Console.WriteLine(serializedXml);
        Console.ReadKey();
    }
}

public class Root
{
    List<FirstNode> firstNode = new List<FirstNode>();

    public List<FirstNode> FirstNode
    {
        get { return firstNode; }
        set { firstNode = value; }
    }
}

public class FirstNode
{
    string data;
    public string Data
    {
        get { return data; }
        set { data = value; }
    }
}

OUTPUT

<Root>
  <FirstNode>
    <FirstNode>
      <Data>DATA</Data>
     </FirstNode>
  </FirstNode>
</Root>

Ожидаемый результат

<Root>
   <FirstNode>
      <Data>DATA</Data>
   </FirstNode>
</Root>

Ответы [ 3 ]

1 голос
/ 02 ноября 2009

Хорошо, если вы посмотрите, у вас есть свойство с именем FirstNode, где вы храните свой список, а внутри списка вы храните объект FirstNode ... Если вы хотите увидеть его, просто измените имя свойства FirstNode в классе Root на Nodes, и вы увидите другой вывод

    <Root>  
      <Nodes>    
       <FirstNode>   
           <Data>DATA</Data>
       </FirstNode>  
      </Nodes>
</Root>

Тег Root появляется, потому что это Тип объекта, а также FirsNode, тогда у вас есть такие теги, как Данные и Узлы (в моем случае), потому что они являются сериализованными свойствами этих классов

0 голосов
/ 02 ноября 2009

Вы хотите:

[XmlElement("FirstNode")]
public List<FirstNode> FirstNode
{
    get { return firstNode; }
    set { firstNode = value; }
}

Это добавит <FirstNode> только к элементам контента, но не к самому списку. Вы также можете посмотреть на [XmlArray] / [XmlArrayItem], если хотите более точный контроль.

0 голосов
/ 02 ноября 2009

Подумайте, что это за строка:

   root.FirstNode.Add(firstNode);

Вы добавляете первый узел к первому узлу и, следовательно, получаете два слоя первого узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...