2013年6月23日 星期日

Serialization in ios with Unity

1.         錯誤的Serialize程式碼
[Serializable]
public class MyClass { …………………}

// Same as
XmlSerializer 
MyClass myClass = new MyClass();
IFormatter formatter = new BinaryFormatter();//
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, myClass);

Error Message in ios:
Unhandled Exception: System.ExecutionEngineException: Attempting to JIT compile method 'UInt32__TypeMetadata:.ctor ()' while running with --aot-only.

2.         What JIT and AOT
   
是兩種不同的compile方式。主要用於在intermediate language(解譯式語言)像是java或者.NET Common Intermediate Language (managed code)
   
因為像這種intermediate language都要經過一道解譯後,執行起來就會比較慢。這兩種方式都是用來改善效能的,AOT是預先將byte code直接與VM compilemachine code,而JIT則是在解譯時動態的預先做一些cache或分析來達到效能最佳化。
AOT: http://en.wikipedia.org/wiki/AOT_compiler
JIT: http://en.wikipedia.org/wiki/Just-in-time_compilation
4.         Another Serialize library
I.          JsonFX: http://www.jsonfx.net/
II.         Protobuf-net: https://code.google.com/p/protobuf-net/
5.         Using Protobuf-net in ios -http://wiki.etc.cmu.edu/unity3d/index.php/Serialization_issue_on_iOS
I.           下載protobuf-net r640版本
II.         將要SerializeData class額外用一個dll library專案,並加上protobuf-net特定的Annotation。這邊Referenceprotobuf-net dll要則選擇core onlyios內的dll
[ProtoContract]
    class MyDataClass {

       
[ProtoMember(1)]
        public int Id {get;set;}
    }
Note:不可有任何不是public的變數或method,否則在下一個Step時會出現non-public Exception.
III.       將輸出的data dllprotobuf-net.dll放在相同資料夾,使用protobuf-net內附帶的precompile.exe產生Serializerdll檔,下cmd指令為precompile {path}\ModelName.dll -o: {path}\SerializerDllName.dll -t:Namespace.SerializerTypeName
IV.      最後將三個dll(data classdllSerializerdllprotobuf-net dll)同時給其它專案Reference即可
Note:這邊要注意dll dependency的問題。因為像現在的Unity專案會使用ResouceLoder來讀const data,但是ResouceLoder class必須要放在Unity專案才行,如果的data classDllreferenceResouceLoder,這樣就會造成dll相互依賴。
6.        Serialize Library比較

C#
BinaryFormatter
protobuf-net
JsonFX
Reference
V
V
X
Extend
V
V
V
Polymorphism
V
V
X
List, Dictionary
V
V
V
In IOS
X
V
V
結論
無法使用在IOS
需要額外使用precompile
無法使用在複雜的資料結構上