Skip to content
mythz edited this page Mar 27, 2013 · 13 revisions

Protocol Buffers is a high-performance, compact binary wire format invented by Google who use it internally so they can communicate with their internal network services at very high speed.

For .NET @marcgravell has developed protobuf-net - a robust implementation of the Protocol Buffers wire format that provides the fastest serialization option available for .NET.

ProtoBuf is a great addition to your ServiceStack's web services as it provides the fastest binary serializer to go along with the 2 fastest text serializers for .NET in JSON and JSV formats (already included by default).

Note: Until we can get marcgravell to succumb to internal pressure and add support for attribute-less POCOs you will need to add unique custom indexes for each property on your DTOs e.g: [DataMember(Order=N)].

Otherwise another fast binary serializer that supports attribute-less POCOs is the new MessagePack Format.

Installing via NuGet

As it requires an external protobuf-net.dll dependency ProtoBuf support is not automatically bundled inside ServiceStack, but it is easily installed with the ServiceStack.Plugins.ProtoBuf NuGet package:

After the NuGet Package is added to your Project, enable the ProtoBuf format with:

Plugins.Add(new ProtoBufFormat());

The NuGet plugin also includes the ProtoBufServiceClient client below so you can easily call it from any C# Client.

Registering ProtoBuf Manually

The API for adding custom Formats and Content Types in ServiceStack is so easy we use it ourselves :) Where the CSV, HTML, Markdown and now ProtoBuf format are all registered in the same way by registering the new ContentType with your AppHost's ContentTypeFilters.

Adding support for ProtoBuf is equally simple. It can be added by calling a single method:

appHost.ContentTypeFilters.Register(ContentType.ProtoBuf,
	(reqCtx, res, stream) => ProtoBuf.Serializer.NonGeneric.Serialize(stream, res),
	ProtoBuf.Serializer.NonGeneric.Deserialize);

This makes the ProtoBuf format available in all of ServiceStack:

  • A new X-PROTOBUF column added for all services on the metadata pages
  • New /x-protobuf/syncreply/{Service} and /x-protobuf/asynconeway/{Service} pre-defined routes
  • Clients can request it with Accept: application/x-protobuf HTTP Header or ?format=x-protobuf query string

End to End happiness

However simply registering ProtoBuf is not enough to ensure end-to-end happiness so we also make it easy to create your own generic strong-typed ProtoBuf ServiceClient with the following code:

	public class ProtoBufServiceClient : ServiceClientBase
	{
		public ProtoBufServiceClient(string baseUri)
		{
			SetBaseUri(baseUri);
		}

		public ProtoBufServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri)
			: base(syncReplyBaseUri, asyncOneWayBaseUri) {}

		public override void SerializeToStream(IRequestContext requestContext, object request, Stream stream)
		{
			Serializer.NonGeneric.Serialize(stream, request);
		}

		public override T DeserializeFromStream<T>(Stream stream)
		{
			return Serializer.Deserialize<T>(stream);
		}

		public override string ContentType
		{
			get { return Common.Web.ContentType.ProtoBuf; }
		}

		public override StreamDeserializerDelegate StreamDeserializer
		{
			get { return Serializer.NonGeneric.Deserialize; }
		}

          public override string Format
          {
                  get { return "x-protobuf"; }
          }
	}

This now lets you call each of your services with a Strong Typed service client of your very own:

var client = new ProtoBufServiceClient(BaseUri);
var response = client.Send<HelloResponse>(new Hello { Name = "ProtoBuf" });

The above ProtoBufServiceClient works like all the other strong-typed ServiceClients in ServiceStack where it also implements IServiceClient and IRestClient interfaces so you can easily swap out your existing clients to take advantage of the performance boost offered by ProtoBuf with minimal effort!

Community Resources



  1. Getting Started
    1. Create your first webservice
    2. Your first webservice explained
    3. ServiceStack's new API Design
    4. Designing a REST-ful service with ServiceStack
    5. Example Projects Overview
  2. Reference
    1. Order of Operations
    2. The IoC container
    3. Metadata page
    4. Rest, SOAP & default endpoints
    5. SOAP support
    6. Routing
    7. Service return types
    8. Customize HTTP Responses
    9. Plugins
    10. Validation
    11. Error Handling
    12. Security
  3. Clients
    1. Overview
    2. C# client
    3. Silverlight client
    4. JavaScript client
    5. Dart Client
    6. MQ Clients
  4. Formats
    1. Overview
    2. JSON/JSV and XML
    3. ServiceStack's new HTML5 Report Format
    4. ServiceStack's new CSV Format
    5. MessagePack Format
    6. ProtoBuf Format
  5. View Engines 4. Razor & Markdown Razor
    1. Markdown Razor
  6. Hosts
    1. IIS
    2. Self-hosting
    3. Mono
  7. Advanced
    1. Configuration options
    2. Access HTTP specific features in services
    3. Logging
    4. Serialization/deserialization
    5. Request/response filters
    6. Filter attributes
    7. Concurrency Model
    8. Built-in caching options
    9. Built-in profiling
    10. Messaging and Redis
    11. Form Hijacking Prevention
    12. Auto-Mapping
    13. HTTP Utils
    14. Virtual File System
    15. Config API
    16. Physical Project Structure
    17. Modularizing Services
  8. Plugins
    1. Sessions
    2. Authentication/authorization
    3. Request logger
    4. Swagger API
  9. Tests
    1. Testing
    2. HowTo write unit/integration tests
  10. Other Languages
    1. FSharp
    2. VB.NET
  11. Use Cases
    1. Single Page Apps
    2. Azure
    3. Logging
    4. Bundling and Minification
    5. NHibernate
  12. Performance
    1. Real world performance
  13. How To
    1. Sending stream to ServiceStack
    2. Setting UserAgent in ServiceStack JsonServiceClient
    3. ServiceStack adding to allowed file extensions
    4. Default web service page how to
  14. Future
    1. Roadmap
Clone this wiki locally