序列化、反序列化(Serializable特性)
前言
之前理解错误,并不是只有添加了[serializable]的类才可以被序列化(转为json等等)
所有普通类都可以被序列话(abstract之类除外。。)
大多数的用途是
想要把这个类显示在Inspector面板上时
便会使用[serializable]
其他情况一般就不会用了
2021.6.18补丁
//需要被实例化的类 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变量了。
声明:此博客为个人学习之用,如与其他作品雷同,纯属巧合,并请明示指出