1. 程式人生 > >Unity序列化中遇見的一點小坑

Unity序列化中遇見的一點小坑

    最近做一個序列化功能需求時,遇到了一點小坑記錄一下。在C#中常見的序列化的方法:BinaryFormatter、SoapFormatter、XmlSerializer。

     我首先選擇了BinaryFormatter類進行序列化和反序列化,它的優點就是以縮略型二進位制格式寫到一個檔案中去,速度比較快,而且寫入後的檔案已二進位制儲存有一定的保密效果。如果類成員中有不想被序列化的物件,可以用NonSerialized來標記。但是過程中我遇到下面了這種情況。

     查了下發現,無法直接對Unity的資料如,vector3, quaternion等使用BinaryFormatter進行序列化,會報“SerializationException: Type UnityEngine.Vector3 is not marked as Serializable”。當然解決辦法也有。比如對vector3, quaternion重新包裝一下。


[Serializable]
    public struct Vector3Serializer
    {
        public float x;
        public float y;
        public float z;
 
        public void Fill(Vector3 v3)
        {
            x = v3.x;
            y = v3.y;
            z = v3.z;
        }
 
        public Vector3 V3
        { get { return new Vector3(x, y, z); } }
    }
 
    [Serializable]
    public struct QuaternionSerializer
    {
        public float x;
        public float y;
        public float z;
        public float w;
 
        public void Fill(Quaternion q)
        {
            x = q.x;
            y = q.y;
            z = q.z;
            w = q.w;
        }
 
        public Quaternion Q
        { get { return new Quaternion(x, y, z, w); } }
    }

當然還可以選擇另外一種方式就是換一種序列化方式。然後我選擇了第二種XmlSerializer。XmlSerializer可以對vector3, quaternion進行序列化。然後有可能的話你會遇見這種情況

遇見這種情況的原因是什麼呢?你參與序列化的類引用了Transform或繼承了MonoBehaviour。解決辦法就是去掉。接下來可能大功告成也有可能遇見下面這種情況。


這種情況是什麼原因造成的呢? 因為Unity3D載入XML檔案的時候,XML檔案必須儲存為UTF-8編碼的格式,同時還必須去掉開頭的兩個位元組(BOM)用來標識UTF-8用的。怎麼去?如下


以上

補充關於XML檔案怎麼儲存為UTF-8編碼的格式