 <p>It should <em>just work</em>; I believe the problem is that the attributes are inverted (I will take a note to raise a clearer error in this case) - it should be :</p> <pre><code>[ProtoContract, ProtoInclude(14, typeof(Update))] class Annoucement { } [ProtoContract] class Update : Announcement { } </code></pre> <p>i.e. the base needs to know about the descendants. Not I removed the discriminator from serialization, as that is redundant <strong><em>if it relates directly to the object type</em></strong> - it handles this internally via the <code>ProtoInclude</code> and will create the correct type for you. Each type needs to know <em>only</em> about the direct subtypes, i.e.</p> <pre><code>A - B - C - D - E - F </code></pre> <p>here A needs to know about B and D; B needs to know about C; D needs to know about E and F.</p> <p>Note that a "what is this" enum is a good idea here, but there is no need for it to be a field - a virtual property without a field may be more appropriate. If I have misundersood and the message-type <em>doesn't</em> relate to the object-type, then ignore me ;p</p> <p>Also: public fields - don't do it. Think of the kittens... It will <em>work</em>, but properties are preferred (in general, I mean; nothing to do with protobuf-net).</p>