5

我们一直在 C# 应用程序中使用 BinarySerialization,但是需要序列化的类的大小和复杂性会导致序列化缓慢(反)序列化和大文件。

我们怀疑我们应该只编写自己的自定义序列化程序;但 protobuf-net 声称与标准 .Net 二进制序列化相比具有显着的速度和大小优势,并且可能比大量定制的序列化程序更容易添加到我们的应用程序中。

在花费大量时间和精力尝试让它为我们工作之前,我很想知道是否有任何交易破坏者。我们正在使用通过接口定义的属性、抽象子类的通用列表、自定义位标志枚举等等等。什么会阻止 protobuf-net 为我们工作?

4

3 回答 3

6

protobuf-net 尽其所能遵守核心 protobuf 规范,然后是一些(例如,它包括继承),但是:

  • v1 不太擅长基于接口的属性(即ICustomer等);我正在努力在 v2 中对此进行改进
  • v1 喜欢有一个无参数的构造函数(这个要求在 v2 中被取消了)
  • 您需要告诉它如何将模型映射到字段;在 v1 中,这需要在类型上进行修饰(或者可以选择从名称等中推断出一些东西);在 v2 中,这可以在外部完成
  • 在 v1 中,标志枚举很痛苦;在 v2 中有一个选项可以将枚举作为原始整数传递,使其更适合 falgs
  • 抽象和继承很好,但您必须能够提前确定所有具体类型(将它们映射到整数键)
  • 泛型应该没问题
  • 没有中间类型的锯齿状数组/嵌套列表是不行的 - 你可以通过在中间引入一个中间类型来填充它
  • 并非所有核心类型都有内置支持(例如,新的日期/时间偏移类型);在“v2”中,如有必要,您可以为此引入自己的垫片
  • 它是序列化器,而不是图形序列化器;我有一些想法,但尚未实施

如果您想要序列化的内容有一些有限的示例,我会很乐意看看它是否可能工作(我是作者)。

于 2010-08-11T21:05:00.723 回答
0

当您必须与现有软件/现有标准交互时,这是不合适的。例如,您不能使用它与 SMTP 服务器进行通信。

于 2010-08-11T21:03:51.243 回答
0

请在有关 protobuf-net 的博客上阅读此内容,以引用

有什么问题?

在大多数情况下,就是这样。WCF 将使用 protobuf-net 来处理任何合适的
对象(数据合同等)。请注意,这是一个比
但是,每个操作控制(您总是可以将界面拆分为
当然,不同的端点)。

此外,protobuf-net 确实有一些细微的差异(尤其是关于空
对象),所以运行你的单元测试等。

请注意,它仅适用于全脂 WCF;它不会帮助 Silverlight 等,因为
它缺少扩展功能——但这并不是什么新鲜事。

最后,WCF 中的解析器很痛苦,AFAIK 想要完整的组装细节
包括版本号;因此,当您获得新版本时,还需要维护一件事。
如果有人知道如何解决这个问题?
于 2010-08-11T21:08:19.407 回答