用于紧凑框架的预编译protobuf-net类型模型

时间:2012-07-24 20:45:15

标签: compact-framework deserialization protocol-buffers protobuf-net

我在紧凑框架(3.5)上反序列化了数千个对象并且速度很慢。使设备完成20秒以上。我发现它是通过反射来完成的,而不是像非紧凑的对应物那样编译和运行。 所以我想,我可以先预编译并生成一个类型模型dll吗?

所以我做了以下事情:

  1. 将所有Contract类提取到智能设备dll(它引用Protobuf-net CF3.5 Dll)
  2. 创建一个桌面3.5控制台应用程序,引用Protobuf-net“Desktop”Dll和上面创建的Contract 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. 使用“new TypeModel()”构建的模型修改它以反序列化,而不是使用默认模型
  5. 它实际上正确编译。我看一下Reflector中生成的dll,就像预期的那样。

    除了在运行时,它抛出MissingMethodException。然而,由于紧凑的框架没有报告,所以缺少确切的缺失。

    我的赌注是因为生成的My.Serialization.dll实际上是指“桌面”dll,但是缺少某些方法。

    回到我的问题,我怎样才能实现在紧凑框架中使用的类型模型预生成?或者我可以通过做其他事情来提升绩效吗?

1 个答案:

答案 0 :(得分:2)

好消息,我怀疑。我花了相当多的时间研究交叉编译问题(好吧,我主要是由人们询问WP7和WinRT),最后是brand new cross-platform precompiler

这已经完成了代码所做的工作,即它在输入程序集/程序集中查找所有[ProtoContract]类型。老实说我没有尝试过CF,但我很有希望。我会真的爱来听听你的表现。我没有对CF进行测试的唯一原因是我的VS2008 VM的外置驱动器死了。

用法:

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

注意:目前您需要从源代码构建“预编译”,但如果这是一个问题,我可以绕过它来发布它。

如果您有任何问题,请告诉我。