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