使用 list
本文关键字:反序列化 XML Object list 使用 | 更新日期: 2023-09-27 18:36:26
那里我的XMl文件:
<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<Asset Type="XnaCzyMap.Element[]">
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>30</pos_y>
<rot>90</rot>
</Element>
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>165</pos_y>
<rot>90</rot>
</Element>
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>340</pos_y>
<rot>25</rot>
</Element>
</Asset>
</XnaContent>
和我的班级:
public class Element
{
[System.Xml.Serialization.XmlElement("id")]
public int id { get; set; }
[System.Xml.Serialization.XmlElement("pos_x")]
public int pos_x { get; set; }
[System.Xml.Serialization.XmlElement("pos_y")]
public int pos_y { get; set; }
[System.Xml.Serialization.XmlElement("rot")]
public int rot { get; set; }
}
我想将我的XML反序列化为"元素"的集合。 当我不使用 XNA 时它有效,但它不再工作了。VS给我以下错误:Error 1 There was an error while deserializing intermediate XML. Cannot find type "XnaCzyMap.Element".
我试图将集合添加为类,但也没有工作。
[System.Xml.Serialization.XmlRoot("XnaContent")]
public class Elements
{
[XmlElement("Element")]
public List<Element> listObjet { get; set; }
}
使用 Xna 反序列化与不使用 Xna 有什么区别?
执行反序列化的代码:
public void load_map(string path)
{
XmlSerializer serializer = new XmlSerializer(typeof(Element[]));
StreamReader reader = new StreamReader(path);
try
{
file = (Element[])serializer.Deserialize(reader);
}
catch (Exception e)
{
}
reader.Close();
}
当我尝试使用"元素类"时,我试图通过"元素"切换"元素[]"
Xna 不会干扰序列化,但代码中存在小错误。
您的代码正确,但您使用的 XML 文件的格式不正确。如果对 XML 文件的预期格式有疑问,请尝试使用 XmlSerializer 的序列化方法创建预期的格式。
在这种情况下,若要执行此操作,必须像这样更改 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfElement Type="XnaCzyMap.Element[]">
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>30</pos_y>
<rot>90</rot>
</Element>
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>165</pos_y>
<rot>90</rot>
</Element>
<Element>
<id>5</id>
<pos_x>54</pos_x>
<pos_y>340</pos_y>
<rot>25</rot>
</Element>
</ArrayOfElement>
请注意我是如何更改根标记的。它的名称(ArrayOfElement)对.NET很重要。
编辑:如果你想保留你的原始XML文件,那很好,但你必须改变代码中的几个错误。
- XmlSerializer 构造将采用 typeof(Elements) 作为参数,而不是 typeof(Element[]),并且还会相应地更改返回类型强制转换。你提到你这样做了。
- 将定位 listObjet 集合 [XmlElement("Element")] 附近的此属性更改为此 [XmlElement("Asset")]。此属性不表示集合成员在 XML 中的外观。它说整个集合将具有什么名称。