栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity-Xml数据解析

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity-Xml数据解析

在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);

        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在线解析工具解析后):


	
	admin
	123456

二、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(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反序列化。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号