Unity3D中的序列化測試


Unity3D中序列化字段常使用[SerializeField],序列化類常采用[System.Serializable],非序列化采用[System.NonSerialized]。

序列化類使用時發現一些區別。測試如下:

(1)

將腳本第一次拖拽到場景中后,運行程序。發現,對類進行序列化后,id,name會保持在代碼中寫的字段值。

如果我們退出運行,對檢視面板的值進行修改,再運行,如下圖所示。那么會始終運行檢視面板中修改的值!

如果我們退出運行,對代碼中的值進行修改,再運行,如下圖所示。那么發現print的值還是運行檢視面板中的值!如下圖所示:

由此可見,序列化類后,顯示的數值由檢視面板的值確定。腳本中的數值只是在第一次拖拽腳本到游戲對象時有用。

套用C#書上的一句話:序列化又稱串行化,是.NET運行時環境用來支持用戶定義類型的流化的機制。其目的是以某種存儲形成使自定義對象持久化,或者將這種對象從一個地方傳輸到另一個地方。

 

如果不想序列化某個類的字段,有兩種方式:第一個就是可以用System.NonSerialized。增加了這個屬性的字段不會在檢視面板中顯示。如下:

 

第二個方式就是將字段的訪問修飾符設置為private或protected即可,如下所示,由於字段為私有或保護,只能在類內或派生的類中訪問。這里采用屬性getname獲取name的值,並print。

 

 一開始我把public ClassToSerialize classSerialize = new ClassToSerialize();的new部分放在Start()中,這時,不管有沒有[Serializable],數值都會以類中寫入的初始值決定。原因就是:Start()在字段賦予初始值之后運行的。如下所示:

沒有運行時,修改id數值:

運行后:

 1 using UnityEngine;
 2 using System.Collections;
 3 using System;
 4 
 5 public class test : MonoBehaviour {
 6     public ClassToSerialize classSerialize;// = new ClassToSerialize()
 7     void Start () {
 8         classSerialize = new ClassToSerialize();//這里實例化
 9         print(classSerialize.id + classSerialize.getname);
10     }
11 }
12 
13 [Serializable]
14 public class ClassToSerialize
15 {
16     public int id = 120;
17    // [NonSerialized]
18     protected string name = "tongtong1989";
19     public string getname
20         {
21         get { return name; }
22         }
23 }

 當然,您也可以不在Start()中實例化,因為已經Serializable了,如下所示:

不過,您不可以把[Serializable]也注釋掉,那樣的話,類就不能序列化,默認初始化為null,調用字段會提示空引用異常!如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM