为紧凑框架预编译 protobuf-net 类型模型
Posted
技术标签:
【中文标题】为紧凑框架预编译 protobuf-net 类型模型【英文标题】:Precompile protobuf-net Type Model for compact framework 【发布时间】:2012-07-24 20:45:14 【问题描述】:我在紧凑框架 (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 实际上是指“桌面”dll,但缺少某些方法。
回到我的问题,我怎样才能实现类型模型预生成以在紧凑框架中使用?或者我可以通过做其他事情来提高性能吗?
【问题讨论】:
【参考方案1】:好消息,我怀疑。我在交叉编译问题上花费了相当多的时间(好吧,我主要是受人们询问 WP7 和 WinRT 的影响),最终得到了brand new cross-platform precompiler。
这已经完成了您的代码所做的工作,即它在输入程序集/程序集中查找所有 [ProtoContract]
类型。老实说,我还没有为 CF 尝试过,但我很有希望。我真的很想听听你的进展。我没有针对 CF 对其进行测试的唯一原因是我的 VS2008 VM 的外部驱动器死机了。
用法:
precompile some path\YourCFDto.dll –o:MySerializer.dll –t:MySerializer
注意:目前您需要从源代码构建“预编译”,但如果这是一个问题,我可以设法发布它。
如果您有任何问题,请告诉我。
【讨论】:
这是准时制!我会试一试并报告。 它确实有效!而且更快。我没有精确测量,但它从大约 20 多秒到大约 5 秒。 一些错误: 1. Meta/MetaType.cs 和 ValueMember.cs - CF 没有 GetRawConstantValue()。 2. precompile.exe -h 求救无效,-h: 有效。 显然它不喜欢输入的完整路径 (C:\...),因为它误将 C: 作为参数参数。 @HelloSam 现在应该都修好了以上是关于为紧凑框架预编译 protobuf-net 类型模型的主要内容,如果未能解决你的问题,请参考以下文章
我需要在生产模式下运行预编译吗?还是为我做的(播放框架 1.2.6)