什么是序列化,反序列化?
- 序列化就是把數據對象轉換成二進制流保存為本地文件的過程。
- 反序列化就是把儲存有數據信息的二進制文件還原成數據對象的過程。
序列化的意義
- 以某種儲存形式(二進制/XML,今天只講二進制方法)使自定義對象持久化
- 方便將對象從一個地方移動到另一個地方(轉移文件再反序列化讀取)
- 使游戲數據不容易被直接篡改
序列化在unity中的注意點
不可以直接序列化unity特有的數據類型(例如Vector3, Quaternion),必須要轉換一下(例子在下)。不然會報錯:"SerializationException: Type UnityEngine.XXX is not marked as Serializable."
舉個例子
using System;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;//實現二進制串行化必需的庫
using System.IO; //實現文件流所必需的庫
public class GoBack : MonoBehaviour
{
public float currentHealth = 0;
private void Awake()
{
Load();
}
private void FixedUpdate()
{
currentHealth += Time.deltaTime;
}
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 100, 30), "Save"))
Save();
if (GUI.Button(new Rect(10, 40, 100, 30), "Load"))
Load();
GUI.Label(new Rect(10,70,100,30),currentHealth.ToString());
}
private void Save()
{
//首先實例化一個二進制串行化對象,用于將數據串行化
BinaryFormatter bf = new BinaryFormatter();
//然后實例化一個文件流用于在目錄中創建 plyaerInfo.dat 文件(文件名自定義)
//persistentDataPath將指向設備上的公用目錄,App的每次更新都將不會刪除此位置的文件
FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
//將實時信息儲存到信息類中,等待序列化。
PlayerData data = new PlayerData();
data.health = currentHealth;
data.sv3 = transform.position;
//序列化儲存
bf.Serialize(file, data); //將data序列化為file文件(即playerInfo.dat)儲存
file.Close(); //關閉流操作
}
private void Load()
{
//首先確定有儲存信息
if (File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
{
//將文件反序列化
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
PlayerData data = bf.Deserialize(file) as PlayerData;
file.Close();
currentHealth = data.health;
transform.position = data.sv3;
}
}
}
[Serializable] //可序列化標志
class PlayerData
{
public float health;
public SerializableVector3 sv3;
}
//在Vector3 和 SerializableVector3之間自動轉換
[Serializable]
public struct SerializableVector3
{
public float x;
public float y;
public float z;
public SerializableVector3(float rX, float rY, float rZ)
{
x = rX;
y = rY;
z = rZ;
}
// 以字符串形式返回,方便調試查看
public override string ToString()
{
return String.Format("[{0}, {1}, {2}]", x, y, z);
}
// 隱式轉換:將SerializableVector3 轉換成 Vector3
public static implicit operator Vector3(SerializableVector3 rValue)
{
return new Vector3(rValue.x, rValue.y, rValue.z);
}
// 隱式轉換:將Vector3 轉成 SerializableVector3
public static implicit operator SerializableVector3(Vector3 rValue)
{
return new SerializableVector3(rValue.x, rValue.y, rValue.z);
}
}
效果.gif
捷徑
有一個可以序列化.net和unity數據結構的unity插件——RunTime Serialization