2010-03-26 71 views
57

我最近不得不尋找C#移植最初由Google開發的Protocol Buffers庫。猜猜看,我發現兩個項目由兩位知名人士所擁有:protobuf-csharp-port,編號Jon Skeetprotobuf-net,編寫的Marc Gravell。我的問題很簡單:我必須選擇哪一個?如何選擇protobuf-csharp-port和protobuf-net

我非常喜歡Marc的解決方案,因爲在我看來,它更接近於C#philisophy(例如,您可以將屬性添加到現有類的屬性中),並且它看起來像它可以支持.NET內置類型,例如System .Guid。

我相信他們都是非常棒的項目,但是你的想法是什麼?

+3

Protobuf-csharp-port當然。喬恩得到更多的聲譽!^_^ – 2010-03-26 11:24:53

+1

巨人之戰! – Farax 2016-05-15 07:57:28

+0

性能怎麼樣? (因爲這是protobuf的主要觀點) 有一個比另一個快嗎? – tigrou 2016-08-09 12:21:46

回答

52

我同意Jon的觀點;如果您在多個環境中編碼,那麼他的版本會爲您提供與其他「核心」實現類似的API。 protobuf-net與大多數.NET序列化器的實現方式相似得多,所以對.NET開發人員更爲熟悉(IMO)。正如喬恩指出的 - 原始二進制輸出應該是相同的,所以你可以重新實現一個不同的API,如果你需要以後。

幾點重新protobuf網是具體此實現:

  • 作品與現有類型(不只是生成的類型從.proto)
  • 作品下之類的WCF和memcached的
  • 可用於實現現有類型的ISerializable
  • 支持繼承*和序列化回調方法
  • 支持常見的圖案,如ShouldSerialize[name]
  • 可以與現有的裝飾類型(XmlType/XmlElementDataContract/DataMember) - 這意味着(舉例來說)是LINQ到SQL車型序列外的開箱(只要序列化在DBML啓用)
  • 在v2中,適用於各類POCO沒有任何屬性
  • 在v2中,工作在.NET 1.1(不知道這是一個巨大的賣點)和大多數其他框架(包括MonoTouch的 - 好極了!)
  • 可能(尚未實施)V2可支持全圖*序列(不只是樹序列化)

(* =這些功能都使用100%有效的protobuf的二進制文件,但可能很難從其他語言消耗)

35

您也在項目中使用其他語言嗎?如果是這樣,我的C#端口將允許您在所有平臺上編寫類似的代碼。如果沒有,Marc的端口可能更習慣於C#。 (我試圖讓自己的代碼像普通的C#一樣「感覺」,但是設計顯然是基於Java代碼開始的,故意使它對於那些使用Java的人來說也很熟悉。)

當然,這是因爲您可以稍後改變主意,並確信您的所有數據通過其他項目仍然有效 - 它們應該絕對是二進制兼容的(就序列化數據而言),據我所知。

+0

沒有我們的項目是完整的C#,我注意到你的項目確實是更多的「跨語言」...... – PierrOz 2010-03-26 10:48:40

+2

@PierrOz:在這種情況下,你可能很想使用Marc的。特別是如果你不需要另外一個.proto定義,Marc的解決方案就更簡單了。 – 2010-03-26 11:14:19

+0

@JonSkeet protobuf-csharp-port是否支持winrt(win8.1和wp8.1)?只是在這裏遇到一些問題http://stackoverflow.com/questions/24670524/does-protobuf-csharp-port-support-windows-rt – IloveIniesta 2014-07-11 04:24:39

6

我剛從的protobuf-CSHARP端口切換到protobuf網因爲:

  • protobuf網是更「像達」,即描述符連載成員,而不是代碼生成。
  • 如果您想編譯protobuf-csharp-port .proto文件,您必須執行兩個步驟,即使用protoc編譯爲.protobin,然後使用protoGen編譯該文件。 protobuf-net只需一步即可完成。
3

在我的情況下,我想使用協議緩衝區來替換.net客戶端和j2ee後端之間的基於xml的通信模型。由於我已經在使用代碼生成功能,因此我會去執行Jon的代碼。

對於不需要java interop的項目,我會選擇Marc的實現,尤其是因爲v2允許在沒有註釋的情況下工作。