什麼是序列化
序列化是將對象狀態轉換爲可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,可以輕鬆地存儲和傳輸數據。簡單的說就是把對象轉換成字節然後到內存中,數據庫中或者是文件中的一個過程。
和TCP傳輸中將傳輸數據轉換爲字節流是一個道理。
一般的序列化方法有bin、xml、json。
序列化在Unity中
當你能在unity的Inspector面板上看到變量的值,那是因爲unity已經進行了序列化。
經常用unity的人應該知道,在運行時從Inspector改變腳本的變量是沒有用的。因爲結束運行之後又會還原成原來的值。
這是因爲 在Inspector面板中更改屬性時,不會調用該屬性內部的get和set方法,因爲unity內部會直接序列化Inspector窗口的字段。
這是因爲unity其實是兩層,C++層與unity控制層。因爲unity的底層是用c++編寫的,我們自己編寫的腳本是c#。當我們點擊運行按鈕時,他們之間會有一個交互,
- 在內部把所有的數據序列化
- 把他們存在c++這一層
- 清除unity控制層這邊所有的內存和消息
- 加載我們編寫的腳本
- 把c++層中存儲的序列化數據反序列化到unity控制層中去。
所以我們在運行時更改組件上的變量其實是沒有用的,因爲我僅僅是更改unity控制層上的數據,正真數據是從c++層讀取出來的。
序列化滿足的條件
-
public 類型,或者有 [SerializeField]
-
不是 static
-
不是 const
-
不是 readonly
-
類型必須是 Unity 可以序列化的類型
Unity 可以序列化的類型
-
自定義的,非 abstract 的類,且有 [Serializable]
-
有 [Serializable] 的結構體
-
UnityEngine.Object 的子類的引用
-
原生類型(int,float,double,bool,string, etc)
-
以上類型的數組
-
以上類型的 List
特殊情況
- 自定義類型結構:(這個暫時不懂)
- 類成員裏面有Null的變量:
例如在序列化一個變量(類.結構等)的時候,如果這個變量裏面有Null,Unity將會的實例化一個新對象,然後序列化,然後進入死循環,因爲Unity的序列化在非主線程運行,所以出現這種情況會導致程序性能下降
最後
在unity中要小心使用序列化,因爲序列化並不是運行在主線程,這違反了內部引擎的單線程機制。