我正在紧凑框架(3.5)上反序列化数千个对象,但速度很慢。设备需要 20 秒以上才能完成。我发现它是通过反射完成的,而不是像非紧凑对应物那样编译并运行。 于是我就想,是不是可以先预编译生成一个类型模型dll呢?
所以我做了以下事情:
- 将所有 Contract 类提取到智能设备 dll(它引用 Protobuf-net CF3.5 Dll)
创建一个桌面 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"); } }
- 返回设备项目,引用 Contract DLL、生成的 My.Serialization.dll 和 Protobuf-net CF3.5 Dll。
- 不使用默认模型,而是将其修改为使用“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/