Compact framework 紧凑框架的预编译protobuf网络型模型

Compact framework 紧凑框架的预编译protobuf网络型模型,compact-framework,deserialization,protocol-buffers,protobuf-net,Compact Framework,Deserialization,Protocol Buffers,Protobuf Net,我在compact framework(3.5)上反序列化了数千个对象,速度很慢。需要20秒以上的时间才能完成。我发现它是通过反射来完成的,而不是像非紧凑的对应物那样编译和运行。 所以我想,我可以先预编译并生成一个类型模型dll吗 因此,我做了以下工作: 将所有合同类提取到智能设备dll(它引用Protobuf net CF3.5 dll) 创建一个桌面3.5控制台应用程序,引用Protobuf net“桌面”Dll和上面创建的契约Dll class Program { static voi

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

因此,我做了以下工作:

  • 将所有合同类提取到智能设备dll(它引用Protobuf net CF3.5 dll)
  • 创建一个桌面3.5控制台应用程序,引用Protobuf net“桌面”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");
      }
    }
    
  • 回到设备项目,参考契约DLL、生成的My.Serialization.DLL和Protobuf net CF3.5 DLL
  • 不是使用默认模型,而是将其修改为使用“new TypeModel()构造的模型反序列化
  • 它实际上编译正确。我在反射器中查看生成的dll,正如预期的那样

    除了在运行时抛出MissingMethodException之外。然而,由于compact framework不报告这一点,所以缺少的正是缺少的内容

    我打赌是因为生成的My.Serialization.dll实际上引用了“Desktop”dll,但缺少某些方法


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

    我想这是个好消息。我花了相当多的时间在交叉编译的问题上(好吧,我主要是被问到WP7和WinRT的人所驱使),最终导致了一个错误

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

    用法:

    precompile {some path}\YourCFDto.dll –o:MySerializer.dll –t:MySerializer
    
    注意:目前您需要从源代码构建“预编译”,但如果这是一个问题,我可以着手发布它


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

    这来得正是时候!我会给它打一针,然后再报告。它确实有效!而且要快得多。我没有精确地进行测量,但测量时间从20多秒增加到了5秒。Meta/MetaType.cs和ValueMember.cs-对于CF.2,没有GetRawConstantValue()。帮助的precompile.exe-h不起作用,-h:起作用。显然,它不喜欢输入的完整路径(C:\…),因为它错误地将C:作为参数处理。@HelloSam这些都应该现在修复