我最近不得不寻找最初由Google开发的Protocol Buffers库的C#移植.猜猜看,我在这里发现了两个知名人士拥有的两个项目:由Jon Skeet编写的protobuf-csharp-port和由Marc Gravell编写的protobuf-net.我的问题很简单:我必须选择哪一个?
我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只添加属性到现有类的属性),看起来它可以支持.NET内置类型,如System.Guid.
我相信他们两个都是很棒的项目,但你的意见是什么?
我同意Jon的观点; 如果您在多个环境中进行编码,那么他的版本会为您提供与其他"核心"实现类似的API.protobuf-net与大多数.NET序列化程序的实现方式更相似,因此对.NET开发人员更为熟悉(IMO).正如Jon所说 - 原始二进制输出应该是相同的,因此如果您以后需要,可以使用不同的API重新实现.
有些点是针对此实现特定的 protobuf-net :
适用于现有类型(不仅仅是.proto生成的类型)
适用于WCF和memcached之类的东西
可用于实现ISerializable
现有类型
支持继承*和序列化回调方法
支持常见的模式,如 ShouldSerialize[name]
适用于现有的装饰类型(XmlType
/ XmlElement
或DataContract
/ DataMember
) - 意味着(例如)LINQ-to-SQL模型开箱即用(只要在DBML中启用了序列化)
在v2中,适用于没有任何属性的POCO类型
在v2中,适用于.NET 1.1(不确定这是一个巨大的销售功能)和大多数其他框架(包括monotouch - yay!)
可能(尚未实现)v2可能支持全图*序列化(不仅仅是树序列化)
(*=这些功能使用100%有效的protobuf二进制文件,但可能很难从其他语言中使用)
您是否也在项目中使用其他语言?如果是这样,我的C#端口将允许您在所有平台上编写类似的代码.如果没有,Marc的端口可能更加惯用C#开头.(我试图使我的代码"感觉"像普通的C#一样,但设计显然是基于Java代码开始的,故意使得那些使用Java的人也熟悉它.)
当然,其中一个优点是您可以稍后改变主意,并确信所有数据仍然可以通过其他项目有效 - 它们应该是绝对二进制兼容的(就序列化数据而言),就我而言我知道.
根据它的GitHub项目网站 protobuf-csharp-port 现已被纳入主要的Google Protocol Buffers项目,因此它将成为protobuf 3的官方.NET实现.然而,protobuf-net 最后一次更新于2013年,尽管已有最近在GitHub提交了一些提交.
我刚刚从protobuf-csharp-port切换到protobuf-net,因为:
protobuf-net更像是".net like",即序列化成员而不是代码生成的描述符.
如果你想编译protobuf-csharp-port .proto文件,你必须做两个步骤,即用protoc编译到.protobin然后用protoGen编译它.protobuf-net一步到位.