序列化、反序列化(Serializable特性)

时间:2023-12-14 23:25:14
//需要被实例化的类
using System.Collections;
using UnityEngine; [Serializable]
public class SerializableClass : MonoBehaviour
{
public string name; public SerializableClass(string name)
{
this.name = name;
}
}
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine; public class SerializableTest : MonoBehaviour
{
public SerializableClass serializableClass; private void Start()
{
this.serializableClass = new serializableClass("cat");
} private void OnGUI()
{
if (GUI.Button(new Rect(10,10,150,100),"Serialize"))
{
string fileName = "Assets/SerializableClass.dat";
Stream fStream = new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite);
BinaryFormatter binFormat = new BinaryFormatter();
binFormat.Serialize(fStream,this.serializableClass);
fStream.Close();
this.serializableClass.name = "dog";
Debug.Log("the class name is : " + this.serializableClass.name);
}
if (GUI.Button(new Rect(300,10,150,100),"Deserialize")
{
string fileName = "Assets/SerializableClass.dat";
Stream fStream = new FileStream(fileName,FileMode.Open,FileAccess.Read);
BinaryFormatter binFormat = new BinaryFormatter();
this.serializableClass = binFormat.Deserialize(fStream) as SerializableClass;
fStream.Close();
Debug.Log("the class name is : " + this.serializableClass.name);
}
}
}
 
 

在此脚本中,我们首先在Start方法中实例化了一个SerializableClass类的对象,名为serializableClass。然后通过OnGUI方法中创建两个按钮分别执行序列化和反序列化的操作。

在序列化部分,将SerializableClass的实例序列化为二进制文件,保存到"Assets/SerializableClass.dat",此时被序列化为二进制的对象的name字段内容为“cat”。下面将该字段的内容修改为“dog”,这时,变量SerializableClass的name字段已经从“cat”变为了“dog”。

然后在反序列化的部分,将"Assets/SerializableClass.dat"这个二进制文件反序列化为类的实例。由于二进制中对应的类的实例的name字段仍为“cat”,将反序列化后的类实例赋值给seri变量,此时serializableClass变量就成了修改name字段之前的serializableClass变量了。

 
 
声明:此博客为个人学习之用,如与其他作品雷同,纯属巧合,并请明示指出