序列化、反序列化(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变量了。

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

posted on 2017-01-19 16:22  Lumious  阅读(234)  评论(0编辑  收藏  举报

导航