用于紧凑框架的预编译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()"构建的模型进行反序列化

它实际上编译正确。我在反射器中查看生成的dll,它与预期的一样。

除了在运行时抛出MissingMethodException。然而,由于紧凑型框架并没有报告这一点,因此缺少了什么。

我打赌是因为生成的MySerialization.dll实际上引用了"Desktop"dll,但缺少一些方法。

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

我怀疑这是个好消息。我在交叉编译问题上花了大量的时间(好吧,我主要是被询问WP7和WinRT的人所驱使),最终开发了一个全新的跨平台预编译器。

这已经完成了代码所做的工作,即在输入程序集中查找所有[ProtoContract]类型。老实说,我还没有尝试过CF,但我很有希望。我真的很想听听你的进展。我没有在CF上测试它的唯一原因是我的VS2008虚拟机的外部驱动器死了。

用法:

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

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

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

最新更新