我使用緊湊框架(3.5)反序列化數以千計的對象,並且速度很慢。將設備拿走20秒以上完成。我發現它是通過反射來完成的,而不是像非緊湊對象那樣編譯運行。 所以我想,我可以預先編譯並生成一個類型模型的DLL第一?預編譯protobuf-net緊湊框架的類型模型
所以我做了以下內容:
- 提取所有合同類智能設備DLL(它引用protobuf網CF3.5 DLL)
創建桌面3.5控制檯應用程序,引用的Protobuf -net「Desktop」Dll和上面創建的合同Dll。
class Program { static void Main(string[] args) { var bb = TypeModel.Create(); foreach (var t in Assembly.GetAssembly(typeof(My.ContractX)).GetTypes()) { var contract = t.GetCustomAttributes(typeof (ProtoBuf.ProtoContractAttribute), false); if (contract.Length > 0) { bb.Add(t, true); } } bb.Compile("My.TypeModel", "My.Serialization.dll"); } }
- 回到設備項目,引用Contract DLL,生成的My.Serialization.dll和Protobuf-net CF3.5 Dll。
- 不使用默認的模式,修改它與「新TypeModel()」所構建的模型反序列化
它實際上正確編譯。我查看Reflector中生成的dll,如預期的那樣。
除了運行時,它會拋出MissingMethodException。然而,由於緊湊的框架沒有報告,所缺少的是缺少的。
我敢打賭,因爲生成的My.Serialization.dll實際上是指「桌面」dll,但缺少一些方法。
所以回到我的問題,我怎麼能實現類型模型預生成在緊湊框架中使用?或者我可以通過做別的事情來提升性能嗎?
這是及時!我會給它一個鏡頭並回報。 – HelloSam 2012-07-25 04:09:48
它確實有效!並且更快。我沒有精確地進行測量,但它從大約20秒到大約5秒。 – HelloSam 2012-07-25 05:10:08
幾個錯誤:1. Meta/MetaType.cs和ValueMember.cs - 沒有CF的GetRawConstantValue()。 2. precompile.exe -h幫助不起作用,-h:確實。 – HelloSam 2012-07-25 05:12:12