我使用紧凑框架(3.5)反序列化数以千计的对象,并且速度很慢。将设备拿走20秒以上完成。我发现它是通过反射来完成的,而不是像非紧凑对象那样编译运行。 所以我想,我可以预先编译并生成一个类型模型的DLL第一?预编译protobuf-net紧凑框架的类型模型
所以我做了以下内容:
- 提取所有合同类智能设备DLL(它引用protobuf网CF3.5 DLL)
创建桌面3.5控制台应用程序,引用的Protobuf -net“Desktop”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"); } }
- 回到设备项目,引用Contract DLL,生成的My.Serialization.dll和Protobuf-net CF3.5 Dll。
- 不使用默认的模式,修改它与“新TypeModel()”所构建的模型反序列化
它实际上正确编译。我查看Reflector中生成的dll,如预期的那样。
除了运行时,它会抛出MissingMethodException。然而,由于紧凑的框架没有报告,所缺少的是缺少的。
我敢打赌,因为生成的My.Serialization.dll实际上是指“桌面”dll,但缺少一些方法。
所以回到我的问题,我怎么能实现类型模型预生成在紧凑框架中使用?或者我可以通过做别的事情来提升性能吗?
这是及时!我会给它一个镜头并回报。 – HelloSam 2012-07-25 04:09:48
它确实有效!并且更快。我没有精确地进行测量,但它从大约20秒到大约5秒。 – HelloSam 2012-07-25 05:10:08
几个错误:1. Meta/MetaType.cs和ValueMember.cs - 没有CF的GetRawConstantValue()。 2. precompile.exe -h帮助不起作用,-h:确实。 – HelloSam 2012-07-25 05:12:12