2

我使用緊湊框架(3.5)反序列化數以千計的對象,並且速度很慢。將設備拿走20秒以上完成。我發現它是通過反射來完成的,而不是像非緊湊對象那樣編譯運行。 所以我想,我可以預先編譯並生成一個類型模型的DLL第一?預編譯protobuf-net緊湊框架的類型模型

所以我做了以下內容:

  1. 提取所有合同類智能設備DLL(它引用protobuf網CF3.5 DLL)
  2. 創建桌面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"); 
        } 
    } 
    
  3. 回到設備項目,引用Contract DLL,生成的My.Serialization.dll和Protobuf-net CF3.5 Dll。
  4. 不使用默認的模式,修改它與「新TypeModel()」所構建的模型反序列化

它實際上正確編譯。我查看Reflector中生成的dll,如預期的那樣。

除了運行時,它會拋出MissingMethodException。然而,由於緊湊的框架沒有報告,所缺少的是缺少的。

我敢打賭,因爲生成的My.Serialization.dll實際上是指「桌面」dll,但缺少一些方法。

所以回到我的問題,我怎麼能實現類型模型預生成在緊湊框架中使用?或者我可以通過做別的事情來提升性能嗎?

回答

2

好消息,我懷疑。我花了很多時間研究交叉編譯問題(好吧,我一直主要是由詢問WP7和WinRT的人推動的),最終在brand new cross-platform precompiler

這已經完成了你的代碼的工作,即它在輸入裝配體/裝配體中查找所有[ProtoContract]類型。我真的沒有嘗試過CF,但我非常有希望。我會真心愛聽到你如何。我沒有對CF進行測試的唯一原因是我的VS2008虛擬機的外置驅動器死亡。

用法:

precompile {some path}\YourCFDto.dll –o:MySerializer.dll –t:MySerializer 

注:此刻的你需要從源代碼編譯「預編譯」,但如果這是一個問題,我可以避開出版它。

如果您有任何問題,請讓我知道。

+0

這是及時!我會給它一個鏡頭並回報。 – HelloSam 2012-07-25 04:09:48

+0

它確實有效!並且更快。我沒有精確地進行測量,但它從大約20秒到大約5秒。 – HelloSam 2012-07-25 05:10:08

+0

幾個錯誤:1. Meta/MetaType.cs和ValueMember.cs - 沒有CF的GetRawConstantValue()。 2. precompile.exe -h幫助不起作用,-h:確實。 – HelloSam 2012-07-25 05:12:12