使用list <object> </object>反序列化XML

时间:2013-10-21 14:27:38

标签: c# xml serialization windows-phone-8

有我的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反序列化为“Element”的集合。当我不使用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进行反序列化有什么区别?

执行反序列化的代码:

  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();
        }

当我尝试使用“Elements class”时,我试图用“Elements”切换“Element []”

1 个答案:

答案 0 :(得分:0)

Xna不会干扰序列化,但您的代码中存在轻微错误。

您的代码是正确的,但您使用的XML文件格式不正确。如果对XML文件的预期格式有疑问,请尝试使用XmlSerializer的Serialize方法创建预期的格式。

在这种情况下,要使其工作,您必须更改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文件,那很好,但您必须更改代码中的多个错误。

  1. XmlSerializer构造将typeof(Elements)作为参数,而不是typeof(Element []),并且还适当地更改返回类型转换。你提到你这样做了。
  2. 将listObjet集合[XmlElement(“Element”)]附近的此属性更改为此属性[XmlElement(“Asset”)]。此属性未说明集合中的成员在XML中的外观。它说明了整个系列的名称。