对象序列化复制节点

时间:2009-11-01 20:51:00

标签: serialization object

有谁能告诉我为什么我的输出会复制'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; }
    }
}

输出

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

预期产出

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

3 个答案:

答案 0 :(得分:1)

好吧,如果你看起来你有一个属性名为FirstNode的存储列表,并且在List中你存储的是FirstNode对象...... 如果你想看到它只是在Root to Nodes类中更改属性FirstNode的名称,你会看到一个不同的输出

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

Root标记出现是因为是Object Type,还有FirsNode,那么你有像Data和Nodes这样的标签(在我的例子中)因为是这些类的序列化属性

答案 1 :(得分:0)

认为这是这一行:

   root.FirstNode.Add(firstNode);

您正在向第一个节点添加第一个节点,从而获得第一个节点的两个层。

答案 2 :(得分:0)

你想:

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

这只会为内容项添加<FirstNode> - 而不是列表本身。如果您想要更好的控制,您可能还需要查看[XmlArray] / [XmlArrayItem]