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

标签 wpf wcf performance protobuf-net precompile

任何人都可以阐明如何将预编译的 protobuf-net 序列化器程序集与 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");

但是,在使用“预编译”时,我还没有添加一种机制来执行此操作 - 这在技术层面上要棘手得多:我不能只在(比如说)属性上使用可执行方法,因为程序集是“预编译”检查可以针对任何 CLI(Silverlight、WinRT、.NET 1.1、CF 等),因此,它是通过非常不同的机制加载的。

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

关于wpf - 使用 protobuf-net RuntimeTypeModel 和使用 WPF 客户端预编译时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371559/

相关文章:

vb.net - 冒泡排序与插入排序 - 尝试编写一个程序来确定哪个更有效

python - 优化基于另一个字段从一个字段中提取子字符串的循环

c# - 使用 http :\\URL 的 WPF 图像 UriSource 和数据绑定(bind)

c# - "ConnectionId"中不存在属性 "http://schemas.microsoft.com/winfx/2006/xaml"

java - Java 对 WPF 的回答是什么?

c# - 将 WCF 服务从测试控制台应用程序移至 IIS

performance - Elasticsearch 中的索引别名和通配符索引端点是否完全相同?

c# - 如何从 C# 代码中调用 Command 而不是通过将 UI 控件绑定(bind)到它?

c# - 如何在不缓冲的情况下流式传输来自 WCF 的响应?

wcf - 通过 WCF 简化 IOC 容器的使用