本文将分享u3d序列化相关知识,内容来源于官方,AI和个人理解
一.计算机领域的序列化概念
序列化,就是把内存中的对象,转换成可存储或可传输的文本或二进制的过程。反过来,把字节流恢复成内存对象,叫做反序列化。
序列化的核心目的是让内存中的复杂数据变为可存储或可传输。
通俗点说,序列化就是做数据处理,让内存数据可存储可传输,并且可逆。
序列化物理上是把内存中可序列化的数据,转换为已序列化的数据。
【序列化到】的意思是将序列化后的内存写入文件的意思
二.u3d的序列化概念
Serializationis the automatic process of transforming data structures or GameObject states into a format that Unity can store and reconstruct later.
序列化是将数据结构或游戏对象状态转换为 Unity 可存储并在以后可重构的格式的自动过程。
序列化相关的3个概念:序列化,可序列化,已序列化
| 概念 | 含义 | 举例 |
|---|---|---|
| 序列化(过程) | 把数据转为可存储格式 | 保存场景时,Unity把Transform的position写入文件 |
| 可序列化(状态) | 字段被标记为可被序列化 | [SerializeField] private int health; |
| 已序列化(结果) | 数据已经被保存或加载过 | 预制体中的值已经保存到.meta或.asset文件里 |
参考:脚本序列化
三.序列化系统
unity有自己的序列化系统,这个系统解决什么情况可被序列化,什么时候发生序列化。
首先要理解的是序列化是对谁序列化?类?属性?字段?方法?
序列化的操作对象指的是可序列化的类中满足条件的字段(field)
对类序列化的意思是对类中满足序列化条件的字段进行序列化
四.可序列化的类
4.1 UnityEngine.Object
继承UnityEngine.Object的类均可序列化,主要有MonoBehaviour和ScriptableObject
4.2 自定义类(非继承UnityEngine.Object)
非static的自定义类上方加上[Serializable]特性后可序列化
五.可序列化字段的条件
- public或具有特性[SerializeField]
- 非static
- 非const
- 非readonly
六.可序列化字段的类型
- 原始数据类型(int/float/double/bool/string等)
- 枚举类型(32位或更小)
- u3d内置类型(Vector2/Vector3/Rect/Color等)
- [Serializable]修饰的struct
- 继承Object的对象的引用
- 上述类型的数组或List<T>
七.发生序列化的时机
7.1 保存和加载
保存和加载场景、资产、AssetBundles时会发生序列化
7.2 修改Inspector
在Inspector中修改值时,unity会在内存中对新值序列化,随后再反序列化更新inspector(无论是否保存场景)
7.3 脚本挂载到对象
将脚本A挂载到对象时,A会发生一次序列化
7.4 创建预制体时
创建预制体B时,B上的所有组件会发生一次序列化,并写入磁盘
7.5 预制体实例化
预制体实例化时,发生反序列化