我在紧凑框架(3.5)上反序列化了数千个对象并且速度很慢。使设备完成20秒以上。我发现它是通过反射来完成的,而不是像非紧凑的对应物那样编译和运行。 所以我想,我可以先预编译并生成一个类型模型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");
}
}
它实际上正确编译。我看一下Reflector中生成的dll,就像预期的那样。
除了在运行时,它抛出MissingMethodException。然而,由于紧凑的框架没有报告,所以缺少确切的缺失。
我的赌注是因为生成的My.Serialization.dll实际上是指“桌面”dll,但是缺少某些方法。
回到我的问题,我怎样才能实现在紧凑框架中使用的类型模型预生成?或者我可以通过做其他事情来提升绩效吗?
答案 0 :(得分:2)
好消息,我怀疑。我花了相当多的时间研究交叉编译问题(好吧,我主要是由人们询问WP7和WinRT),最后是brand new cross-platform precompiler。
这已经完成了代码所做的工作,即它在输入程序集/程序集中查找所有[ProtoContract]
类型。老实说我没有尝试过CF,但我很有希望。我会真的爱来听听你的表现。我没有对CF进行测试的唯一原因是我的VS2008 VM的外置驱动器死了。
用法:
precompile {some path}\YourCFDto.dll –o:MySerializer.dll –t:MySerializer
注意:目前您需要从源代码构建“预编译”,但如果这是一个问题,我可以绕过它来发布它。
如果您有任何问题,请告诉我。