unity中的序列化

什么是序列化

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。简单的说就是把对象转换成字节然后到内存中,数据库中或者是文件中的一个过程。

和TCP传输中将传输数据转换为字节流是一个道理。

一般的序列化方法有bin、xml、json。

序列化在Unity中

当你能在unity的Inspector面板上看到变量的值,那是因为unity已经进行了序列化。
经常用unity的人应该知道,在运行时从Inspector改变脚本的变量是没有用的。因为结束运行之后又会还原成原来的值。
这是因为 在Inspector面板中更改属性时,不会调用该属性内部的get和set方法,因为unity内部会直接序列化Inspector窗口的字段。
这是因为unity其实是两层,C++层与unity控制层。因为unity的底层是用c++编写的,我们自己编写的脚本是c#。当我们点击运行按钮时,他们之间会有一个交互,

  1. 在内部把所有的数据序列化
  2. 把他们存在c++这一层
  3. 清除unity控制层这边所有的内存和消息
  4. 加载我们编写的脚本
  5. 把c++层中存储的序列化数据反序列化到unity控制层中去。

所以我们在运行时更改组件上的变量其实是没有用的,因为我仅仅是更改unity控制层上的数据,正真数据是从c++层读取出来的。

序列化满足的条件

  1. public 类型,或者有 [SerializeField]

  2. 不是 static

  3. 不是 const

  4. 不是 readonly

  5. 类型必须是 Unity 可以序列化的类型

Unity 可以序列化的类型

  1. 自定义的,非 abstract 的类,且有 [Serializable]

  2. 有 [Serializable] 的结构体

  3. UnityEngine.Object 的子类的引用

  4. 原生类型(int,float,double,bool,string, etc)

  5. 以上类型的数组

  6. 以上类型的 List

特殊情况

  1. 自定义类型结构:(这个暂时不懂)
  2. 类成员里面有Null的变量:

例如在序列化一个变量(类.结构等)的时候,如果这个变量里面有Null,Unity将会的实例化一个新对象,然后序列化,然后进入死循环,因为Unity的序列化在非主线程运行,所以出现这种情况会导致程序性能下降

最后

在unity中要小心使用序列化,因为序列化并不是运行在主线程,这违反了内部引擎的单线程机制。

你可能感兴趣的:(unity中的序列化)