Unity之XML序列化和反序列化

  • 序列化是把一个对象持久化到一个磁盘中的过程。应用程序的一部分,甚至另一个应用程序都可以反序列化对象,使它的状态与序列化之前相同。
  • 会用到System.Xml.Serialization名称空间。
  • 序列化:System.Xml.Serialization命名空间中最重要的类是XmlSerializer。要序列化对象,首先需要实例化一个XmlSerializer对象,指定要序列化的对象类型,然后实例化一个流/写入器对象,以把文件写入流/文档中。最后一步是在XmlSerializer上调用Serializer()方法,给它传递流/写入器对象和要序列化的对象。
  • 反序列化:从XML文档中反序列化对象,应执行上述逆向过程。创建一个流/读取器对象和一个XmlSerializer对象,然后给DeSerializer()方法传递该流/读取器对象。这个方法返回序列化的对象,尽管它需要强制转换为正确的类型。
------------玩家信息类----------
public class PlayerInfos
{
    public struct Pos
    {
        public float x, y, z;
    }

   public Pos pos;
    public string name;
    public int level;
    public int hp;

   public PlayerInfos()
    {
       
    }
    public PlayerInfos(int l, int h)
    {
        this.level = l;
        this.hp = h;
    }
}
------------------------------------------------------------------------------------
using System.IO;
using System.Xml.Serialization;
using UnityEditor;
using UnityEngine;

public class SerializedXML : MonoBehaviour {

    private string path;
    public GameObject player;
    public GameObject newPlayer;
    PlayerInfos info=new PlayerInfos(1,60);
    void Awake()
    {
        path = Application.dataPath + "/xml/MySerializedXML.xml";
        player=GameObject.Find("Player");
        newPlayer=new GameObject("newPlayer");
    }
    
void Update () {
    if (Input.GetMouseButtonDown(0))//序列化
    {
        Serialized();

    }
    if (Input.GetMouseButtonDown(1))//反序列化
    {
        DeSerialized();
    }
    if (Input.GetKeyDown(KeyCode.L))
    {
        if (info.level < 10)
        {
            info.level++;
        }
    }
    if (Input.GetKeyDown(KeyCode.H))
    {
        if (info.hp < 100)
        {
            info.hp += 10;
        }
    }
    }
----------序列化----------
    public void Serialized()
    {
        info.pos.x = player.transform.position.x;
        info.pos.y = player.transform.position.y;
        info.pos.z = player.transform.position.z;
        info.name = player.name;
       StreamWriter sw;
        FileInfo fi = new FileInfo(path);
        if (fi.Exists)
        {
            fi.Delete();
        }
        sw = fi.CreateText();
        XmlSerializer xml = new XmlSerializer(typeof(PlayerInfos));
        xml.Serialize(sw,info);
        sw.Close();
        AssetDatabase.Refresh();
    }Unity之XML序列化和反序列化
----------反序列化----------
    public void   DeSerialized()
    {
       FileStream fs=new FileStream(path,FileMode.Open);
        XmlSerializer xml = new XmlSerializer(typeof(PlayerInfos));
        PlayerInfos info=  xml.Deserialize(fs) as PlayerInfos;
        newPlayer.transform.position=new Vector3(info.pos.x,info.pos.y,info.pos.z);
        newPlayer.name = info.name;
    }
}
序列化时:
Unity之XML序列化和反序列化
序列化后:
Unity之XML序列化和反序列化