Question: I have been reading about protobuf-net and it is amazing!

Are there any tutorials that I could use? (More specifically for `Dictionary<TKey,TValue>` and contracts for generics)

Are there any tips associated with it?

Could I simply plug it into my current codebase or are there any changes I need to do?

Answer: 
`Dictionary<TKey,TValue>` should largely just work (in "v1" at least; I haven't written that yet for "v2").

I fully admit that the documentation is... sparse. Things that leap to mind:

* [Getting Started](http://code.google.com/p/protobuf-net/wiki/GettingStarted) (and there are a few other pages in the wiki)
* there are a *host* of things in the [trunk](http://code.google.com/p/protobuf-net/source/browse/#svn/trunk); the "Examples" project doubles as the unit-tests, so may help
* [my blog](http://marcgravell.blogspot.com/search/label/protobuf-net)

I have a *lot* happening at the moment (I've just changed jobs, etc), but my priorities are:

* get a stable "v2" beta released, at least the core feature set
* improve the documentation

Time is my biggest enemy. But if you have a specific scenario, feel free to ping me and I'll try to get back to you ASAP.

Re "can I simply plug it in"; that depends on your code ;-p

It needs *some* way of determining a unique number for each member that you want to serialize. The simplest way to do this is via attributes; it supports any of `[XmlElement(Order=n)]`, `[DataMember(Order=n)]` or `[ProtoMember(n)]`. If you already have at least one of these (LINQ-to-SQL includes `[DataMember]`, for example) then it may simply work.

There *are* options to automatically infer the numbers, but that is brittle and not recommended. Only use this if you **know** you never need to add more members (it orders them alphabetically, so adding a new `AardvarkCount` will break everything).

In "v2" (unreleased, but works), you can now handle the metadata independently of the types - i.e. you can use protobuf-net with POCO, unattributed types. You can also bypass the constructors etc (WCF-style). Much more flexible, if you want it. The attribute approach is supported too, of course.
Funnily enough, I just answered another question with a link to [protobuf-net](https://stackoverflow.com/questions/2891658/settings-file-as-dictionary-with-serialization/2891915#2891915).

I found it relatively simple to do, and Marc is very responsive via email. (Hehe, sorry if I'm inviting people to spam you with questions!)

For documentation, I did mention that it was a bit sparse. But here's what I was using it for:

I had an XML based messaging system that was a bit too verbose. So I wanted to replace the messages with something that would encode the same information, but much more compact. Protobuf-net turned out to be perfect for this, and I've not replaced my xmlserialzer-based module with a proto-based one.

It was pretty simple. I went through my project, replacing [XmlInclude] and similar attributes with [ProtoInclude], and I of course replaced the xml serializer with the proto serializer. One or two issues regarding which types could be serialized were resolved with Marc's help, and not very much code refactoring.