A flexible Protocol Buffers serializer/deserializer for .NET that supports dynamic objects, dictionaries, and schema-aware deserialization.
Protobuf.NET provides a complete solution for working with Protocol Buffers in .NET environments. It allows you to:
- Parse and validate
.protofiles - Serialize .NET objects to Protocol Buffers binary format
- Deserialize Protocol Buffers data in multiple flexible ways
- As dynamic objects
- As dictionaries
- As schema-aware dynamic objects
dotnet build- Proto File Support: Parser and validator for
.protofiles - Flexible Serialization: Easily serialize data on the fly
- Multiple Deserialization Options:
- Dynamic objects
- Dictionaries with type information
- Schema-aware dynamics that use field names from your proto files
var parser = new ProtoParser();
var validator = new ProtoValidator();
var protoFile = parser.ParseFile("product.proto");
validator.Validate(protoFile);dynamic product = new ExpandoObject();
product.product_name = (1, "T-Shirt");
product.available_quantities = (2, 1000);
product.images = (3, new List<string> { "https://example.com/image1.png" });
byte[] serializedData = ProtobufSerializer.Serialize(product);Note: The value must always be a tuple where the first element indicates the field number.
var product = ExpandoObjectExtensions.CreateMessage()
.AddField("product_name", 1, "T-Shirt")
.AddField("available_quantities", 2, 1000)
.AddField("images", 3, new[] { "https://example.com/image1.png" });
byte[] serializedData = product.BuildAndSerialize();Keys are formatted as field_number(field_type) and arrays as field_number(field_type)[]
var deserialized = serializedProduct.DeserializeAsDictionary();
Console.WriteLine($"Product Name: {deserialized["1(string)"]}");
Console.WriteLine($"Available Quantities: {deserialized["2(int32)"]}");
Console.WriteLine($"Images:");
foreach (var image in (List<object?>)deserialized["3(string)[]"])
Console.WriteLine($" - Image: {image}");Property names are formatted as fieldType_fieldNumber_(Array if any)
dynamic deserialized = serializedProduct.DeserializeAsDynamic();
Console.WriteLine($"Product Name: {deserialized.String_1}");
Console.WriteLine($"Available Quantities: {deserialized.Int32_2}");
Console.WriteLine($"Images:");
foreach (var image in (List<object?>)deserialized.String_3_Array)
Console.WriteLine($" - Image: {image}");Uses original field names from the proto file definition
dynamic deserialized = serializedProduct.DeserializeWithSchema("product.proto", "Product");
Console.WriteLine($"Product Name: {deserialized.product_name}");
Console.WriteLine($"Available Quantities: {deserialized.available_quantities}");
Console.WriteLine($"Images:");
foreach (var image in deserialized.images)
Console.WriteLine($" - Image: {image}");Contributions are welcome! Please feel free to submit a Pull Request.
Protobuf.NET is released under the MIT license.