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();
}
----------反序列化----------
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;
}
}
序列化时: