Unity 中XML序列化和反序列化

2020-11-30 18:15发布

序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程。
与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。这就是序列化的意义所在。

XML序列化的实质:
序列化是不一个对象持久化到磁盘的一个过程,应用程序的一部分,甚至另一个程序都可以反序列化对象,是它的状态与序列化之前相同,,用到的名空间System.Xml.Serialization名称空间,反序列化可以理解为把该过程到过来再来一遍,,

XML序列化过程的描述:
System.Xml.Serialization命名空间中最重要的类使XmlSerializer,,,要序列化对象,首先要有被序列化的对象(比如:人物信息),,首先有一个指定的流文件(FileInfo),而后创建传入路径下的文件, 并且 实例化一个流/写入器对象(StreamWriter)作为接收,,,最后需要实例化一个XmlSerializer对象,指定要序列化的对象类型,,在XmlSeralization上调用Serializer()方法,,,记得要关闭流,,
给它传递流/写入器对象和要序列化的对象被序列化的数据可以为基本数据类型的数据,字段,数组,以及XmlElement和XmlAttribute对象格式的内嵌XML,,,

XML反序列化的过程描述:
从XML文档中反序列化对象,应执行上述逆向过程,创建一个流/读取器对象和一个XmlSerializer对象,然后给DeSerializer()方法传递该流/读取对象,这个方法返回序列化对象,尽管它需要强制转换为正确的类型,,

实际代码演示:序列化一个游戏物体(例如玩家,怪物,NPC等)对象的实例,可以将它的数据(例如:位置,名字,等级,血量,经验)序列化到XML中,,,
将以下挂载到cube上,程序运行,移动cube,并点击序列化和反序列化按钮,,,

using System;

using System.IO;

using System.Xml.Serialization;

using UnityEngine;


/// <summary>

/// 注意一定是公开的  需要序列化的玩家信息

/// </summary>

public class Player

{

    public struct Pos

    {

        public float x, y, z;

    }

    public Pos pos;

    public string name;

    public float Exp;

    public int Level;

    public int HP;


}


public class SerializerDemo : MonoBehaviour {


    private string path;     //存储XML的路径

    public Player p1;        //获取玩家引用

    // Use this for initialization

    void Start () {

        path = Application.dataPath + "/Demo.xml";


        //实例化玩家,并初始化数据

        p1 = new Player();

        p1.name = "Czhenya";

        p1.Exp = 0;

        p1.Level = 0;

        p1.HP = 0;

       


}

void OnGUI () {

        if (GUILayout.Button("CreateXML"))

        {

            p1.pos.x = this.transform.position.x;

            p1.pos.y = this.transform.position.y;

            p1.pos.z = this.transform.position.z;

            SerCreate();

        }


        if (GUILayout.Button("DeXML"))

        {

            

            DeSerCreate();

        }

    }


    /// <summary>

    /// 序列化方法

    /// </summary>

    private void SerCreate()

    {

        //指定流文件  (创建XML的目录)

        FileInfo info = new FileInfo(path);

        //Debug.Log(info);


        StreamWriter sw;  //流写入器对象,,

        if (!info.Exists) //判断路径是否存在

        {

            //不存在创建

            sw = info.CreateText();

        }

        else

        {

            //存在就删除,再创建

            info.Delete();

            sw = info.CreateText();

        }



        //实例化对象,并 指定序列化的类型

        XmlSerializer ser = new XmlSerializer(typeof(Player));

        //序列化方法,,(流写入器,玩家)

        ser.Serialize(sw,p1);


        sw.Close();  //关闭流

    }


    /// <summary>

    /// 反序列化方法

    /// </summary>

    private void DeSerCreate()

    {

        //指定流文件 

        FileStream fs = new FileStream(path,FileMode.Open);

        XmlSerializer xmlSer = new XmlSerializer(typeof(Player));

        Player readp1 =(Player) xmlSer.Deserialize(fs);

        Debug.Log(readp1.name);  //得到的玩家信息

        //将反序列化的信息赋值给玩家

        this.transform.position = new Vector3(readp1.pos.x, readp1.pos.y, readp1.pos.z);

    }

    }


}




作者:Czhenya

链接:https://czhenya.blog.csdn.net/article/details/78045186

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。