---
slug: protobuf-format
title: ProtoBuf Format
---
[Protocol Buffers](http://code.google.com/p/protobuf/) 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](http://twitter.com/marcgravell) has developed **[protobuf-net](http://code.google.com/p/protobuf-net/)** - a robust implementation of the Protocol Buffers wire format that provides the [fastest serialization](http://www.servicestack.net/benchmarks/#northwind-serializer) 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](http://www.servicestack.net/mythz_blog/?p=344) and [JSV](http://www.servicestack.net/mythz_blog/?p=176) formats (already included by default).
Otherwise another fast binary serializer that supports attribute-less POCOs is the new [MessagePack Format](/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.ProtoBuf](https://nuget.org/packages/ServiceStack.ProtoBuf) NuGet package:
:::copy
``
:::
After the NuGet Package is added to your Project, enable the ProtoBuf format in your `AppHost` with:
```cs
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:
```csharp
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:
```csharp
public class ProtoBufServiceClient : ServiceClientBase
{
public override string Format
{
get { return "x-protobuf"; }
}
public ProtoBufServiceClient(string baseUri)
{
SetBaseUri(baseUri);
}
public ProtoBufServiceClient(string syncReplyBaseUri, string asyncOneWayBaseUri)
: base(syncReplyBaseUri, asyncOneWayBaseUri) { }
public override void SerializeToStream(IRequest req, object request, Stream stream)
{
Serializer.NonGeneric.Serialize(stream, request);
}
public override T DeserializeFromStream(Stream stream)
{
return Serializer.Deserialize(stream);
}
public override string ContentType
{
get { return MimeTypes.ProtoBuf; }
}
public override StreamDeserializerDelegate StreamDeserializer
{
get { return Deserialize; }
}
private static object Deserialize(Type type, Stream source)
{
return Serializer.NonGeneric.Deserialize(type, source);
}
}
```
This now lets you call each of your services with a Strong Typed service client of your very own:
```csharp
var client = new ProtoBufServiceClient(BaseUri);
var response = client.Send(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
- [REST with ProtoBuf - Web Services in 5 easy steps](http://stevenhollidge.blogspot.com/2012/04/servicestack-rest-with-protobuf.html) by [@stevenhollidge](https://twitter.com/stevenhollidge)