在Unity中使用Xml序列化和反序列化,是不需要像LitJson那样引入一个单独的类库,我们可以直接使用System.Xml,以及System.Xml.Serialization来进行Xml的序列化和反序列化。 我们就以用户名和密码的类对象来举例。
一、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>(loginInfo);
Debug.Log(xmlStr);
}
private string ToXml<T>(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 version="1.0" encoding="utf-8"?>
<LoginInfo
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<userName>admin</userName>
<password>123456</password>
</LoginInfo>
二、Xml反序列化
我们可以在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<LoginInfo>(streamReader.BaseStream);
Debug.Log(loginInfo.userName);
}
private T ToObject<T>(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反序列化。
|