C# 单个标记中相同类型的多个对象的序列化

本文关键字:对象 序列化 同类型 单个标 | 更新日期: 2023-09-27 18:37:14

我想使用xml序列化重现以下XML:

<Room>
<!-- One light-->  
<light Type="Incadenscent" fin="QS f" ItemType="something "/>
<!-- Unlimited Tables -->
<table Type="BR" Id="10"/>
<table Type="BL" Id="21"/>
<table Type="BR" Id="22"/>
<table Type="GR" Id="35"/>
<table Type="BR" Id="18"/>
<table Type="RE" Id="55"/>
</Room>

以下是我的对象类型:

public class Table
{
    [XmlAttribute("type")]
    public string Type
    {
        get; set;
    }
    [XmlAttribute("Id")]
    public String Id
    {
        get; set;
    }
}
public class Light
{
    [XmlAttribute("type")]
    public string Type
    {
        get; set;
    }
    [XmlAttribute("fin")]
    public string FIN
    {
        get; set;
    }
    [XmlAttribute("ItemType")]
    public string ItemType
    {
        get; set;
    }
 }
public class Room{
      public Table Table
    {
        get; set;
    }
    public Light Light
    {
        get; set;
    }
  }
 public  class Program
{
    static void Main(string[] args)
    {
        List<Room> list = new List<Room>
        {
            new Room
            {
                Light = new Light{ Type="Incadenscent",  fin="QS", ItemType="something"},
                Table = new Table{Type="Metal", Id="10"}
                //error here when I try to add a new table object
                Table = new Table{Type="Wood", Id="13"}
            }
           } ;     
         SerializeToXML(list);
    }
    static public void SerializeToXML(List<Room> sample) 
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Room>)););
        TextWriter textWriter = new StreamWriter(@"C:'assets.xml");
        serializer.Serialize(textWriter, sample);
        textWriter.Close();
    }
}

当我尝试在 Room 对象中实例化另一个表对象时,我收到错误(特别是对象的重复)。我做错了什么?

例如:

                **Table = new Table{Type="Wood", Id="13"}**

如何在不出现重复错误的情况下实例化房间列表中的另一个表对象

C# 单个标记中相同类型的多个对象的序列化

有一个简单的解决方案:

public class Room
{
     [XmlElement("light")]
     public Light Light { get; set; }
     [XmlElement("table")]
     public List<Table> Tables { get; set; }
}

初始化如@HackedByChinese的答案所述。

将列表声明为 [XmlElement],然后它将不会序列化 元素,并且 xml 看起来与您想要的完全一样。

您的 XML 与类不匹配。 Room声明它包含一个Light和一个Table,其中XML有多个Tables

Room应该看起来更像:

public class Room
{
     public Light Light { get; set; }
     public List<Table> Tables { get; set; }
}

并像这样创建对象:

    new Room
    {
        Light = new Light{ Type="Incadenscent",  fin="QS", ItemType="something"},
        Tables = new List<Table>{ new Table{Type="Metal", Id="10"},
                                  new Table{Type="Wood", Id="13"} }
    }

但是,您仍然会遇到反序列化问题。XmlSerializer 希望 XML 看起来更像:

<Room>
    <light Type="Incadenscent" fin="QS f" ItemType="something "/>
    <tables>
       <table Type="BR" Id="10"/>
       <table Type="BL" Id="21"/>
       <table Type="BR" Id="22"/>
       <table Type="GR" Id="35"/>
       <table Type="BR" Id="18"/>
       <table Type="RE" Id="55"/>
     </tables>
</Room>

但是,如果生成的 XML 必须按照您在示例中指定的方式进行外观,则需要在 Table 上实现IXmlSerializable,并使用 XmlReaderXmlWriter 手动反序列化和序列化(分别)。