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"}**
如何在不出现重复错误的情况下实例化房间列表中的另一个表对象
有一个简单的解决方案:
public class Room
{
[XmlElement("light")]
public Light Light { get; set; }
[XmlElement("table")]
public List<Table> Tables { get; set; }
}
初始化如@HackedByChinese的答案所述。
将列表声明为 [XmlElement],然后它将不会序列化
您的 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
,并使用 XmlReader
和 XmlWriter
手动反序列化和序列化(分别)。