使用protobuf-net RuntimeTypeModel和WPF客户端预编译时出现的问题



有人能告诉我如何将预编译的protobuf网络序列化程序集与WCF和客户端一起使用(不在代码中进行序列化/反序列化)来加快DTO类型的首次使用吗?

通过使用protobuf-net与datacontractserializer,我已经在我的大型WCF/WPF应用程序中获得了很多性能改进。然而,即使我可以从DTO预编译序列化程序集,我也无法让WCF或它的WPF客户端使用它。web服务进程总是需要很长时间才能从该进程进行涉及新DTO的任何第一次调用,大概是为了动态生成序列化程序集。如何指示WCF服务器和/或WPF客户端使用我生成的程序集?

在一个相关的问题上,我在一些DTO中有SolidColorBrush类型的属性,这使得预编译器陷入了"没有为类型定义序列化程序:System.Windows.Media.SolidColorBrush"的困境。我有一些代码可以将这种支持添加到protobuf-net模型中,但我不知道如何将其应用到预编译器或我的代码中,因为DTO的其余部分都用属性(如ProtoContractAttribute)修饰。

任何帮助都非常感谢

目前,让WCF使用预编译模型的唯一方法是通过代码手动配置WCF,特别是手动添加ProtoOperationBehavior,并指定模型:

var behavior = new ProtoOperationBehavior();
behavior.Model = new MyPrecompiledSerializer();

我承认我没有一个完整的端到端WCF的例子来做到这一点。我怀疑,在新版本中,调整ProtoBehaviorExtension和/或ProtoBehaviorAttribute以允许您通过配置指定自定义序列化程序类型可能会更容易,但该代码目前还不存在。

在此期间,如果问题是第一次操作的轻微延迟,那么您也可以在默认模型中添加一些您需要的类型:

RuntimeTypeModel.Default.Add(typeof(Foo), true);
RuntimeTypeModel.Default.Add(typeof(Bar), true);
RuntimeTypeModel.Default.CompileInPlace();

也就是说:编译并不慢得可怕——如果它导致明显的延迟,我会有点惊讶,除非你的模型真的很复杂(数百种类型)。延迟是否可能只是WCF、网络、TCP等开销?


关于SolidBrush,暗示:Color-可以在运行时配置它们

RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.Color), false)
.Add("R", "G", "B", "A");
RuntimeTypeModel.Default.Add(typeof(System.Windows.Media.SolidColorBrush), false)
.Add("Color");

然而,在使用"precompile"时,我还没有添加这样做的机制——这在技术层面要复杂得多:我不能只对(比如)属性使用可执行方法,因为"precomple"检查的程序集可以用于任何CLI(Silverlight、WinRT、.NET 1.1、CF等)——因此,它是由非常不同的机制加载的。

我的首选方法是:不要将其公开为System.Windows.Media.Color——编写自己的DTO类来表示数据(而不是最终实现),并在它们之间进行映射。或者,也可以编写自己的实用工具控制台exe,其作用类似于"预编译",方法是配置模型,然后调用RuntimeTypeModel.Default.Compile(string,string)RuntimeTypeModel.Default.Compile(CompilerOptions)

最新更新