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