如何使用C#XmlSerializer反序列化此XML文档结构?
...
<Data>
<Hotspot>
<Properties>
<xPos>0.5</xPos>
<yPos>0.3</yPos>
<alpha>0.1</alpha>
</Properties>
<Properties>
<xPos>0.4</xPos>
<yPos>0.7</yPos>
<alpha>0.2</alpha>
</Properties>
</Hotspot>
<Hotspot>
<Properties>
<xPos>0.1</xPos>
<yPos>0.2</yPos>
<alpha>0.9</alpha>
</Properties>
<Properties>
<xPos>0.2</xPos>
<yPos>0.3</yPos>
<alpha>0.8</alpha>
</Properties>
</Hotspot>
</Data>
我在Unity工作,我想用这个XML文档中的位置数据驱动一个GUI元素。
以下是我的反序列化代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using System;
using System.IO;
public class Data
{
public List<Hotspot> Hotspot;
[XmlIgnore]
public Data XmlData;
public void Deserialize()
{
XmlSerializer deserializer = new XmlSerializer(typeof(Data));
TextReader reader = new StreamReader(@"D:\Unity Projects\Axion800_Kabine\Assets\hspositions.xml");
object obj = deserializer.Deserialize(reader);
XmlData = (Data)obj;
reader.Close ();
}
}
public class Hotspot
{
public List<Properties> Properties = new List<Properties>();
}
public class Properties
{
public float xPos;
public float yPos;
public float alphaValue;
}
仅出于测试目的,我制作了另一个脚本来实际使用XML数据并将其附加到GUI元素:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class UseXMLData : MonoBehaviour
{
private RectTransform rectTrans;
private int _index = 0;
private Data data;
void Awake ()
{
data = new Data();
data.Deserialize();
rectTrans = GetComponent<RectTransform>();
}
void Update ()
{
rectTrans.anchoredPosition = new Vector2(data.XmlData.Hotspot[0].Properties[_index].xPos, data.XmlData.Hotspot[0].Properties[_index].yPos);
_index++;
if(_index == data.XmlData.Hotspot[0].Properties.Count - 1)
_index = 0;
}
}
这是我收到的错误消息:
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[Properties].get_Item (Int32 index) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:633)
UseXMLData.Update () (at Assets/UseXMLData.cs:21)
在我看来,XML数据从未成功读取,因此数组不包含数据。我是如何设置数据,热点和属性类的?
非常感谢您的帮助!
肖恩
答案 0 :(得分:1)
如果使用XmlElement属性修饰Hotspot和Properties集合,则反序列化工作正常:
public class Data
{
[XmlElement("Hotspot")]
public List<Hotspot> Hotspot;
[XmlIgnore]
public Data XmlData;
public void Deserialize()
{
XmlSerializer deserializer = new XmlSerializer(typeof(Data));
TextReader reader = new StreamReader(@"XMLFile1.xml");
object obj = deserializer.Deserialize(reader);
XmlData = (Data)obj;
reader.Close();
}
}
public class Hotspot
{
[XmlElement("Properties")]
public List<Properties> Properties = new List<Properties>();
}
public class Properties
{
public float xPos;
public float yPos;
[XmlElement("alpha")]
public float alphaValue;
}
答案 1 :(得分:0)
在您的XML中
<alpha>???</alpha>
并在你的班级
public float alphaValue;
也许正在使用
public float alpha;
会奏效。