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編碼的格式




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