2

我正在反序列化紧凑框架(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 实际上是指“桌面”dll,但缺少某些方法。

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

4

1 回答 1

2

好消息,我怀疑。我在交叉编译问题上花费了相当多的时间(好吧,我主要是受人们询问 WP7 和 WinRT 的影响),最终开发了一个全新的跨平台预编译器

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

用法:

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

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

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

于 2012-07-24T21:13:43.757 回答