compact-framework - 为紧凑框架预编译 protobuf-net 类型模型

标签 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()”构造的模型进行反序列化

它实际上编译正确。我在Reflector中查看生成的dll,与预期相符。

除了在运行时,它会抛出 MissingMethodException。然而,到底缺少什么,因为紧凑框架没有报告这一点。

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

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

最佳答案

我怀疑这是个好消息。我花了相当疯狂的时间来研究交叉编译问题(好吧,我主要是被询问 WP7 和 WinRT 的人驱使的),最终得到了 brand new cross-platform precompiler .

这已经完成了您的代码所做的事情,即它在输入程序集中查找所有 [ProtoContract] 类型。老实说我还没有尝试过CF,但我很有希望。我真诚地想听听你过得怎么样。我没有针对 CF 进行测试的唯一原因是我的 VS2008 VM 的外部驱动器死机了。

用法:

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

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

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

关于compact-framework - 为紧凑框架预编译 protobuf-net 类型模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639029/

相关文章:

java - 如何使用 Gson 反序列化继承公共(public)基类的类型?

c++ - 使用 Google Protocol Buffer - 如何在 .proto 文件中定义字段

c++ - Protocol Buffers (protobuf) v3.0.0-alpha-2 中的可选字段和约束

c# - 保存和加载图像 SQLite C#

C# 自动属性反序列化 - 列表

c# - 使用 Newtonsoft Json.Net 反序列化数组对象

c++ - 我如何利用 ZeroMQ 编写自己的 Protocol Buffers RPC 实现

.net - 如何在 ASP.NET Web 应用程序中为 Windows Mobile 创建 SQL Compact 3.5 数据库?

c# - 在 Windows Mobile 上关闭 GPRS 连接

windows - 在 Windows Mobile 中检测打开的 url