最近做一個序列化功能需求時,遇到了一點小坑記錄一下。在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編碼的格式