我最近不得不寻找最初由Google开发的Protocol Buffers库的C#移植。猜猜看,我发现这里有两个知名人士拥有的两个项目:protobuf-csharp-port,由Jon Skeet和protobuf-net编写,由Marc Gravell撰写。我的问题很简单:我必须选择哪一个?
我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只为现有类的属性添加属性),看起来它可以支持.NET内置类型,如System。 GUID。
我相信他们两个都是很棒的项目,但你的意见是什么?
答案 0 :(得分:57)
我同意Jon的观点;如果您在多个环境中进行编码,那么他的版本会为您提供与其他“核心”实现类似的API。 protobuf-net与大多数.NET序列化程序的实现方式更相似,因此对.NET开发人员更为熟悉(IMO)。正如Jon所说 - 原始二进制输出应该是相同的,因此如果您以后需要,可以使用不同的API重新实现。
对于此实现具体的一些重点是protobuf-net:
ISerializable
ShouldSerialize[name]
XmlType
/ XmlElement
或DataContract
/ DataMember
) - 意味着(例如)LINQ-to-SQL模型序列化了-the-box(只要在DBML中启用序列化)(* =这些功能使用100%有效的protobuf二进制文件,但可能很难从其他语言中使用)
答案 1 :(得分:40)
您是否也在项目中使用其他语言?如果是这样,我的C#端口将允许您在所有平台上编写类似的代码。如果没有,Marc的端口可能更加惯用C#开头。 (我试图使我的代码“感觉”像普通的C#一样,但设计显然是基于Java代码开始的,故意使得熟悉那些使用Java的人。)
当然,其中一个优点是您可以稍后改变主意,并确信所有数据仍然可以通过其他项目有效 - 它们应该是绝对二进制兼容的(就序列化数据而言),如据我所知。
答案 2 :(得分:7)
根据它的GitHub project site protobuf-csharp-port 现已被纳入主要的Google Protocol Buffers项目,因此它将成为protobuf的官方.NET实现3.然而,protobuf-net是last updated in 2013,尽管有some commits recently in GitHub。
答案 3 :(得分:6)
我刚从protobuf-csharp-port切换到protobuf-net因为:
答案 4 :(得分:3)
在我的情况下,我想使用协议缓冲区来替换.net客户端和j2ee后端之间基于xml的通信模型。由于我已经在使用代码生成,因此我将使用Jon的实现。
对于不需要java互操作的项目,我会选择Marc的实现,特别是因为v2允许在没有注释的情况下工作。