在Unity中使用Xml序列化和反序列化,是不需要像LitJson那样引入一个单独的类库,我们可以直接使用System.Xml,以及System.Xml.Serialization来进行Xml的序列化和反序列化。
我们就以用户名和密码的类对象来举例。
逻辑很简单,通过API获取C#对象的Stream文件流,再转码成string字符串,为了方便通用,这里使用泛型进行了提取,代码如下:
using System.Text;
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
public class Test : MonoBehaviour
{
///
/// 登录验证信息
///
public class LoginInfo
{
public string userName;
public string password;
public LoginInfo() { }
public LoginInfo(string userName, string password)
{
this.userName = userName;
this.password = password;
}
}
private void Start()
{
LoginInfo loginInfo = new LoginInfo("admin","123456");
MemoryStream memoryStream = new MemoryStream();
string xmlStr = ToXml(loginInfo);
Debug.Log(xmlStr);
}
///
/// Xml序列化
///
/// 类型
/// 对象
///
private string ToXml(object arg)
{
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, arg);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
string xmlStr = Encoding.UTF8.GetString(memoryStream.ToArray());
return xmlStr;
}
}
这里需要注意的是,我们在定义类的构造函数时,必须要构建一个无参的构造函数,否则序列化会失败。
最终结果(此结果经过Xml在线解析工具解析后):
二、Xml反序列化 admin 123456
我们可以在Unity项目面板创建StreamignAssets文件夹,创建Test.xml文件,将以上结果复制进来,为下面反序列化做准备。
这里我使用VSCode打开并编辑,各位同学可使用记事本/VS编辑。
好了,直接上代码:
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
public class Test : MonoBehaviour
{
///
/// 登录验证信息
///
public class LoginInfo
{
public string userName;
public string password;
public LoginInfo() { }
public LoginInfo(string userName, string password)
{
this.userName = userName;
this.password = password;
}
}
private void Start()
{
//文件路径
string filePath = Application.streamingAssetsPath + "/Test.xml";
StreamReader streamReader = new StreamReader(filePath);
LoginInfo loginInfo = ToObject(streamReader.BaseStream);
Debug.Log(loginInfo.userName);
}
///
/// Xml反序列化
///
/// 类型
/// 文件流
///
private T ToObject(Stream stream)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
T type = (T)serializer.Deserialize(stream);
return type;
}
}
逻辑如下:这里使用IO中的StreamReader,获取文件流,传入并调用API直接反序列化为C#对象。
最终结果:
如果是接口返回的数据或在WebGL平台,可以使用UnityWebRequest获取byte[]字节数组,转化为Stream,再调用API,即可实现Xml反序列化。



