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.
[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 compile成machine code,而JIT則是在解譯時動態的預先做一些cache或分析來達到效能最佳化。
AOT: http://en.wikipedia.org/wiki/AOT_compiler
JIT: http://en.wikipedia.org/wiki/Just-in-time_compilation
是兩種不同的compile方式。主要用於在intermediate language(解譯式語言)像是java或者.NET Common Intermediate Language (managed code)。
因為像這種intermediate language都要經過一道解譯後,執行起來就會比較慢。這兩種方式都是用來改善效能的,AOT是預先將byte code直接與VM compile成machine 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/
I.
下載protobuf-net r640版本
II.
將要Serialize的Data class額外用一個dll library專案,並加上protobuf-net特定的Annotation。這邊Reference的protobuf-net dll要則選擇core only的ios內的dll。
[ProtoContract]
class MyDataClass {
[ProtoMember(1)]
public int Id {get;set;}
}
Note:不可有任何不是public的變數或method,否則在下一個Step時會出現non-public Exception.
[ProtoContract]
class MyDataClass {
[ProtoMember(1)]
public int Id {get;set;}
}
Note:不可有任何不是public的變數或method,否則在下一個Step時會出現non-public Exception.
III. 將輸出的data
dll和protobuf-net.dll放在相同資料夾,使用protobuf-net內附帶的precompile.exe產生Serializer的dll檔,下cmd指令為precompile
{path}\ModelName.dll -o: {path}\SerializerDllName.dll
-t:Namespace.SerializerTypeName
IV. 最後將三個dll檔(data class的dll、Serializer的dll、protobuf-net
dll)同時給其它專案Reference即可
Note:這邊要注意dll dependency的問題。因為像現在的Unity專案會使用ResouceLoder來讀const data,但是ResouceLoder class必須要放在Unity專案才行,如果的data class的Dll會reference到ResouceLoder,這樣就會造成dll相互依賴。
Note:這邊要注意dll dependency的問題。因為像現在的Unity專案會使用ResouceLoder來讀const data,但是ResouceLoder class必須要放在Unity專案才行,如果的data class的Dll會reference到ResouceLoder,這樣就會造成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
|
無法使用在複雜的資料結構上
|