protobuf-net 不适用于哪些场景?

5
我们一直在使用BinarySerialization作为我们C#应用程序的序列化方式,但是需要被序列化的类的大小和复杂性导致了序列化和反序列化速度缓慢,并且生成大文件。
我们怀疑我们应该编写自己的定制序列化器;但protobuf-net声称相比于标准的.Net二进制序列化具有显著的速度和大小优势,并且可能比大量的定制序列化器更容易添加到我们的应用程序中。
在花费大量时间和精力尝试让它为我们工作之前,我想知道是否存在任何无法克服的问题。我们使用接口定义的属性,抽象子类的通用列表,自定义位标志枚举等等。这些因素会阻止protobuf-net为我们工作吗?
3个回答

6
protobuf-net尽可能遵循核心protobuf规范,并且还包括继承等功能。但是:
  • v1不太擅长基于接口的属性(例如,ICustomer等);我正在努力改进v2
  • v1需要有一个无参构造函数(这个要求在v2中取消了)
  • 您需要告诉它如何将模型映射到字段;在v1中,这需要在类型上进行装饰(或者从名称等推断一些内容),在v2中可以在外部完成
  • v1中的标志枚举很麻烦;在v2中,有一个选项可以将枚举作为原始整数传递,使其更适合标志
  • 抽象和继承都可以,但是必须能够预先确定所有具体类型(将它们映射到整数键)
  • 泛型应该没问题
  • 没有中间类型的嵌套列表/交错数组不行-您可以通过引入中间类型来解决此问题
  • 并非所有核心类型都有内置支持(例如新的日期/时间偏移类型);在“v2”中,如果需要,可以引入自己的shim
  • 它是一个树形序列化程序,而不是图形序列化程序;我有一些想法,但还没有实现

如果有一些你想要序列化的有限示例,我很乐意看一下它是否可能起作用(我是作者)。


那么,v2进展如何?;) - Joel in Gö
@Joel - 哎呀;我一直忙于 SO 的新“聊天”系统,已经有几周没看它了;我需要找时间来完成它。它真的非常接近完成(大约估计完成了95%)。 - Marc Gravell
你的意思是如果两个对象在一个字段中持有对同一对象的引用会出现问题吗? - Joel in Gö

0

当你需要与现有的软件/现有标准进行交互时,这并不合适。例如,你无法使用它来与SMTP服务器通信。


0

请在博客上阅读关于protobuf-net的内容,引用如下:

有什么限制吗?
大部分情况下就是这样。WCF将使用protobuf-net来处理任何适合的对象(数据契约等)。请注意,这比每个操作的控制更粗略(当然,您可以将接口拆分为不同的端点)。
此外,protobuf-net确实有一些微妙的差异(特别是关于空对象),因此请运行您的单元测试等。
请注意,它仅适用于完整版WCF;它对Silverlight等没有帮助,因为它缺少扩展功能-但这在这里并不新鲜。
最后,WCF中的解析器很烦人,据我所知,需要包括版本号在内的完整程序集详细信息;因此,在获取新版本时还要维护一件事情。如果有人知道如何解决这个问题,请告诉我。

那个引用主要是关于WCF插件的,它只是protobuf-net的一小部分。 - Marc Gravell
啊...好的,你得到了点赞! ;) 马克做得很好...我必须研究一下这个protobuf-net...因为我一直想在一个项目中研究它,但因为其他事情(比如生活)而一直搁置! :P - t0mm13b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接