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中要小心使用序列化,因爲序列化並不是運行在主線程,這違反了內部引擎的單線程機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章