views:

397

answers:

3

Hi Folks,

I've recently had to look for a C# porting of the Protocole Buffer library originally developped by Google. And guess what, I found two projects owned both by two very well known persons here: protobuf-csharp-port, written by Jon Skeet and protobuf-net, written by Marc Gravell. My question is simple: which one do I have to choose ?

I quite like Marc's solution as it seems to me closer to C# philisophy (for instance, you can just add attributes to the properties of existing class) and it looks like it can support .NET built-in types such as System.Guid.

I am sure both of them are really great projects but what's your oppinion?

+2  A: 

Are you using other languages in your project as well? If so, my C# port will let you write similar code on all platforms. If not, Marc's port is probably more idiomatic C# to start with. (I've tried to make my code "feel" like normal C#, but the design is clearly based on the Java code to start with, deliberately so that it's familiar to those using Java as well.)

Of course one of the beauties of this is that you can change your mind later and be confident that all your data will still be valid via the other project - they should be absolutely binary compatible (in terms of serialized data), as far as I'm aware.

Jon Skeet
no our project is full C# and I noticed that your project indeed was more "cross-languages"...
PierrOz
@PierrOz: In that case you may well want to use Marc's. In particular if you don't need a .proto definition for anything else, Marc's solution is easier.
Jon Skeet
+4  A: 

I agree with Jon's points; if you are coding over multiple environments, then his version gives you a similar API to the other "core" implementations. protobuf-net is much more similar to how most of the .NET serializers are implemented, so is more familiar (IMO) to .NET devs. And as Jon notes - the raw binary output should be identical so you can re-implement with a different API if you need to later.

Some points re protobuf-net that are specific to this implementation:

  • works with existing types (not just generated types from .proto)
  • works under things like WCF and memcached
  • can be used to implement ISerializable for existing types
  • supports inheritance* and serialization callback methods
  • supports common patterns such as ShouldSerialize[name]
  • works with existing decorated types (XmlType/XmlElement or DataContract/DataMember) - meaning (for example) that LINQ-to-SQL models serialize out-of-the-box (as long as serialization is enabled in the DBML)
  • in v2, works for POCO types without any attributes
  • in v2, works in .NET 1.1 (not sure this is a huge selling feature) and most other frameworks (including monotouch - yay!)
  • possibly (not yet implemented) v2 might support full-graph* serialization (not just tree serialization)

(*=these features use 100% valid protobuf binary, but which might be hard to consume from other languages)

Marc Gravell
+2  A: 

I just switched from protobuf-csharp-port to protobuf-net because:

  • protobuf-net is more ".net like", i.e. descriptors to serialise members instead of code generation.
  • If you want to compile protobuf-csharp-port .proto files you have to do a 2 step process, i.e. compile with protoc to .protobin and then compile that with protoGen. protobuf-net does this in one step.
Nick