当前位置:  开发笔记 > 编程语言 > 正文

如何在protobuf-csharp-port和protobuf-net之间进行选择

如何解决《如何在protobuf-csharp-port和protobuf-net之间进行选择》经验,为你挑选了4个好方法。

我最近不得不寻找最初由Google开发的Protocol Buffers库的C#移植.猜猜看,我在这里发现了两个知名人士拥有的两个项目:由Jon Skeet编写的protobuf-csharp-port和由Marc Gravell编写的protobuf-net.我的问题很简单:我必须选择哪一个?

我非常喜欢Marc的解决方案,因为在我看来,我更接近C#philisophy(例如,你可以只添加属性到现有类的属性),看起来它可以支持.NET内置类型,如System.Guid.

我相信他们两个都是很棒的项目,但你的意见是什么?



1> Marc Gravell..:

我同意Jon的观点; 如果您在多个环境中进行编码,那么他的版本会为您提供与其他"核心"实现类似的API.protobuf-net与大多数.NET序列化程序的实现方式更相似,因此对.NET开发人员更为熟悉(IMO).正如Jon所说 - 原始二进制输出应该是相同的,因此如果您以后需要,可以使用不同的API重新实现.

有些点是针对此实现特定的 protobuf-net :

适用于现有类型(不仅仅是.proto生成的类型)

适用于WCF和memcached之类的东西

可用于实现ISerializable现有类型

支持继承*和序列化回调方法

支持常见的模式,如 ShouldSerialize[name]

适用于现有的装饰类型(XmlType/ XmlElementDataContract/ DataMember) - 意味着(例如)LINQ-to-SQL模型开箱即用(只要在DBML中启用了序列化)

在v2中,适用于没有任何属性的POCO类型

在v2中,适用于.NET 1.1(不确定这是一个巨大的销售功能)和大多数其他框架(包括monotouch - yay!)

可能(尚未实现)v2可能支持全图*序列化(不仅仅是树序列化)

(*=这些功能使用100%有效的protobuf二进制文件,但可能很难从其他语言中使用)



2> Jon Skeet..:

您是否也在项目中使用其他语言?如果是这样,我的C#端口将允许您在所有平台上编写类似的代码.如果没有,Marc的端口可能更加惯用C#开头.(我试图使我的代码"感觉"像普通的C#一样,但设计显然是基于Java代码开始的,故意使得那些使用Java的人也熟悉它.)

当然,其中一个优点是您可以稍后改变主意,并确信所有数据仍然可以通过其他项目有效 - 它们应该是绝对二进制兼容的(就序列化数据而言),就我而言我知道.


@PierrOz:在这种情况下你可能想要使用Marc's.特别是如果你不需要.proto定义,Marc的解决方案就更容易了.
@Jadoon:是的,那里没有可移植性问题.

3> Silas..:

根据它的GitHub项目网站 protobuf-csharp-port 现已被纳入主要的Google Protocol Buffers项目,因此它将成为protobuf 3的官方.NET实现.然而,protobuf-net 最后一次更新于2013年,尽管已有最近在GitHub提交了一些提交.



4> Nick..:

我刚刚从protobuf-csharp-port切换到protobuf-net,因为:

protobuf-net更像是".net like",即序列化成员而不是代码生成的描述符.

如果你想编译protobuf-csharp-port .proto文件,你必须做两个步骤,即用protoc编译到.protobin然后用protoGen编译它.protobuf-net一步到位.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有