什么是序列化和反序列化?
-
序列化:将对象(object)转化为二进制字节序列
-
反序列化:将二进制字节序列转化为对象(object)
-
序列化(Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
本质就是讲信息按照一定格式二进制化(字节序列),从而可以进行存储或者传输方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变化成字节序列也更方便网络运输和传播。
-
序列化不一定会保存到文件或数据库中,可能只在内存中
-
进阶理解
序列化可以用于跨平台。实际上就是把一段数据翻译成(序列化)比较底层的语言(如汇编、机器语言),而基于这个底层语言再可以翻译(反序列化)成多种上一层的语言。
两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。可以简单的理解序列化的目的就是为了跨进程传递格式化数据
对于游戏领域来说,序列化讲的是游戏中的数据写进文件,包括角色的生命、攻击、防御等等,这样当游戏需要调整时(比如平衡性问题),就只需对文件进行改写,而不需要讲游戏重新进行编译、玩家在更新的时候也只需要下载几个被改写的文件即可
序列化有什么作用?
传输数据。比如网络中只能传递二进制字节流。
- 将对象的状态保持在存储媒体中,以便在以后重新创建精确的对象信息(不是唯一手段)
- 可以通过字节流在不同应用程序域中传递
Unity序列化
Unity会自动序列化所有你自己写的脚本组件(Scriptable Object), 重载新的程序集,并且重新创建你的脚本组件。简单的说,序列化后,数据就可以被保存了。Unity序列化过程不走.NET的方法,而是Unity内部的方法。序列化后的数据具有持久存储的特性,简单理解只要是在Inspector窗口中暴露出来的字段都是序列化后的结果
[Serializable]和[SerializeField]是一对好兄弟,一个是用来序列化类和结构体,一个是用来序列化属性成员的。
对象序列化后具有持久保存的特点,Unity提供了两种将持久数据保存成文件的操作(包括读取)
通过xml,json等序列化Serialize和反序列化DeSerialize操作
Unity提供的ScriptableObject
SerializeField : 表示变量可被序列化。众所周知,公有变量可以在检视面板中看到并编辑,而私有和保护变量不行。SerializeField与private,protected结合使用可以达到让脚本的变量在检视面板里可视化编辑,同时保持它的私有性的目的。
HideInInspector : 将原本显示在检视面板上的序列化值隐藏起来。
NonSerialized :通过此方法可以将一个公有变量不序列化并且不显示在检视面板中。
Serializable:用在类的前面,表示该类可被序列化。