So wählen Sie zwischen protobuf-csharp-port und protobuf-net

70

Ich musste kürzlich nach einer C # -Portierung der Protokollpuffer-Bibliothek suchen, die ursprünglich von Google entwickelt wurde. Und raten Sie mal, ich habe hier zwei Projekte gefunden, die beiden sehr bekannten Personen gehören: protobuf-csharp-port , geschrieben von Jon Skeet und protobuf-net , geschrieben von Marc Gravell . Meine Frage ist einfach: Welches muss ich wählen?

Marcs Lösung gefällt mir sehr gut, da sie mir näher an der C # -Philosophie liegt (Sie können beispielsweise nur Eigenschaften zu den Eigenschaften der vorhandenen Klasse hinzufügen) und anscheinend integrierte .NET-Typen wie System.Guid unterstützt.

Ich bin mir sicher, dass beide wirklich großartige Projekte sind, aber was ist Ihre Meinung?

PierrOz
quelle
3
Protobuf-csharp-Port natürlich. Jon hat mehr Ruf! ^ _ ^
Arnis Lapsa
1
Schlacht der Riesen!
Farax
1
Was ist mit Leistung? (da dies der Hauptpunkt von Protobuf ist) Gibt es einen schneller als den anderen?
Tigrou

Antworten:

63

Ich stimme Jons Punkten zu; Wenn Sie über mehrere Umgebungen codieren, bietet Ihnen seine Version eine ähnliche API wie die anderen "Kern" -Implementierungen. protobuf-net ähnelt viel mehr der Implementierung der meisten .NET-Serialisierer und ist daher für .NET-Entwickler vertrauter (IMO). Und wie Jon Noten - der rohe Binärausgang sollte identisch sein , so dass Sie mit einer anderen API neu implementieren können , wenn Sie später benötigen.

Einige Punkte bezüglich Protobuf-Net, die für diese Implementierung spezifisch sind :

  • funktioniert mit vorhandenen Typen (nicht nur generierte Typen aus .proto)
  • funktioniert unter Dingen wie WCF und memcached
  • kann verwendet werden, um ISerializablefür vorhandene Typen zu implementieren
  • unterstützt Vererbungs- * und Serialisierungs-Rückrufmethoden
  • unterstützt gängige Muster wie ShouldSerialize[name]
  • funktioniert mit vorhandenen dekorierten Typen ( XmlType/ XmlElementoder DataContract/ DataMember) - was (zum Beispiel) bedeutet, dass LINQ-zu-SQL-Modelle sofort serialisiert werden (solange die Serialisierung in der DBML aktiviert ist)
  • Funktioniert in Version 2 für POCO-Typen ohne Attribute
  • funktioniert in v2 in .NET 1.1 (nicht sicher, ob dies eine große Verkaufsfunktion ist) und den meisten anderen Frameworks (einschließlich Monotouch - yay!)
  • möglicherweise (noch nicht implementiert) v2 die Vollgraph * -Serialisierung (nicht nur die Baumserialisierung).

(* = Diese Funktionen verwenden 100% gültige Protobuf-Binärdateien, die jedoch möglicherweise nur schwer in anderen Sprachen verwendet werden können.)

Marc Gravell
quelle
45

Verwenden Sie in Ihrem Projekt auch andere Sprachen? In diesem Fall können Sie über meinen C # -Port auf allen Plattformen ähnlichen Code schreiben. Wenn nicht, ist Marc's Port wahrscheinlich zunächst idiomatischer C #. (Ich habe versucht, meinen Code wie normales C # "fühlen" zu lassen, aber das Design basiert eindeutig auf dem Java-Code, damit er auch denjenigen vertraut ist, die Java verwenden.)

Eine der Schönheiten dabei ist natürlich, dass Sie Ihre Meinung später ändern können und sicher sein können, dass alle Ihre Daten über das andere Projekt weiterhin gültig sind - sie sollten für mich absolut binär kompatibel sein (in Bezug auf serialisierte Daten) bin mir bewusst.

Jon Skeet
quelle
Nein, unser Projekt ist voll C # und ich habe festgestellt, dass Ihr Projekt in der Tat mehr "sprachübergreifend" war ...
PierrOz
3
@PierrOz: In diesem Fall möchten Sie vielleicht Marc's verwenden. Insbesondere wenn Sie für nichts anderes eine .proto-Definition benötigen, ist die Lösung von Marc einfacher.
Jon Skeet
@ JonSkeet Unterstützt protobuf-csharp-port winrt (win8.1 und wp8.1)? Treten
Sie
@ JonSkeet Ich habe einige Probleme mit plattformübergreifendem Code, der über ZeroMQ miteinander "spricht". Ich benutze protoc, um Java- und C ++ - Klassen zu generieren, und meine Java- und C ++ - Codes chatten großartig miteinander! Ich habe Protogen verwendet, um meine C # -Klassen zu generieren, und ich versuche, C ++ dazu zu bringen, mit C # zu sprechen. Dies funktioniert nicht: Die hier gestellte Frage wäre so freundlich, einen kurzen Blick darauf zu werfen? Vielen Dank für Ihre Zeit hier, es wird am meisten geschätzt ...
MoonKnight
2
@ Jadoon: Ja, da gibt es keine Portabilitätsprobleme.
Jon Skeet
7

Ich habe gerade von protobuf-csharp-port zu protobuf-net gewechselt, weil:

  • protobuf-net ist eher ".net like", dh Deskriptoren zum Serialisieren von Mitgliedern anstelle der Codegenerierung.
  • Wenn Sie protobuf-csharp-port .proto-Dateien kompilieren möchten, müssen Sie einen zweistufigen Prozess ausführen, dh mit protoc zu .protobin kompilieren und diesen dann mit protoGen kompilieren. protobuf-net erledigt dies in einem schritt.
Nick
quelle
3

In meinem Fall möchte ich Protokollpuffer verwenden, um ein XML-basiertes Kommunikationsmodell zwischen einem .net-Client und einem j2ee-Backend zu ersetzen. Da ich bereits die Codegenerierung verwende, werde ich mich für Jons Implementierung entscheiden.

Für Projekte, die kein Java Interop erfordern, würde ich die Implementierung von Marc wählen, zumal v2 das Arbeiten ohne Anmerkungen ermöglicht.

Juanagui
quelle