原文链接:Unity插件开发基础-浅谈序列化系统 - UWA Blog
这是侑虎科技第296篇原创文章,感谢作者Jintiao供稿,欢迎转发分享,未经作者授权请勿转载。当然,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:465082844)
作者Github:https://github.com/jintiao 一、前言
public class SerializationRuleWindow : EditorWindow {
public MyClass m1;
public MyClassSerializable s1;
private MyClassSerializable s2;
}
复制代码
点击编辑器菜单"Window -> Serialization Test -> Test 1 - Serialization Rule"打开插件窗口,可以看到窗口中显示着所有对象当前的值,并且可以通过滚动条修改各个对象的值。一切看起来很美好,接下来我们退出编辑器再重新打开,看看插件窗口会出现什么变化:
可以看到,s1的两个成员f1和i2保存了原来的值,其它成员都被清零了,我们来具体分析一下为什么会是这样。
编辑器退出前会对所有打开的窗口进行序列化并保存序列化数据到硬盘。在重启编辑器后,序列化系统读入序列化数据,重新生成对应的窗口对象。在对我们的插件对象SerializationRuleWindow进行序列化时,只有满足序列化规则的对象的值得以保存,不满足规则的对象则被序列化系统忽略。
我们来仔细看一下规则判定的情况。
首先看public MyClass m1,它的类型是MyClass,属于“没有标记[Serializable]属性的类”,不满足类型规则;它的字段是public,满足字段规则;系统要求两条规则同时满足的对象才能序列化,于是它被跳过了。
接下来看public MyClassSerializable s1,它的类型是MyClassSerializable,属于标记了[Serializable]属性的类,满足类型规则;它的字段是public,满足字段规则;s1同时满足类型规则和字段规则,系统需要对它进行序列化操作。
序列化是一个递归过程,对s1进行序列化意味着要对s1的所有类成员对象进行序列化判断。所以现在轮到s1中的成员进行规则判断了。
public float f1,类型float是c#原生数据类型,满足类型规则;字段是public,满足字段规则;判断通过。
[NonSerialized]public float f2,字段被标记了[NonSerialized],不满足字段规则。
private int i1,字段是private,不满足字段规则。
[SerializeField]private int i2,类型int是c#原生数据类型,满足类型规则;字段被标记了[SerializeField],满足字段规则;判断通过。
所以s1中f1和i2通过了规则判断,f2和i1没有通过。所以图中s1.f1和s1.i2保留了原来的值。
最后我们看private MyClassSerializable s2,这时相信我们都能轻易看出来,private不满足字段规则,s2被跳过。 四、跨过序列化的坑