title: What is the difference between ProtoBuf.Serializer and ProtoBuf.Meta.TypeModel in protobuf-net?
body: <p>As I recently discovered we can serialize/deserialize in protobuf-net using two classes <code>ProtoBuf.Serializer</code> and <code>ProtoBuf.Meta.TypeModel</code>.
  For example, let's say we have a custom class that we want to serialize/deserialize:</p>
  
  <pre><code>[ProtoContract]
  public class Person
  {
      [ProtoMember(1)]
      public string Name { get; set; }
      [ProtoMember(2)]
      public int Age { get; set; }
  }
  </code></pre>
  
  <p>We can do it in two ways:</p>
  
  <p>1) Using <code>TypeModel</code></p>
  
  <pre><code>TypeModel typeModel = RuntimeTypeModel.Default;
  var person1 = new Person
  {
      Name = "John",
      Age = 23
  };
  
  using (var stream = new MemoryStream())
  {
      typeModel.Serialize(stream, person1);
      stream.Position = 0;
      var pesrson2 = typeModel.Deserialize(stream, null, typeof(Person));
  }
  </code></pre>
  
  <p>2) Using <code>Serializer</code> (which is the chosen way in most of the tutorials I've seen)</p>
  
  <pre><code>var person1 = new Person
  {
      Name = "John",
      Age = 23
  };
  using (var stream = new MemoryStream())
  {
      Serializer.Serialize(stream, person1);
      stream.Position = 0;
      var pesrson2 = Serializer.Deserialize&lt;Person&gt;(stream);
  }
  </code></pre>
  
  <p>What is the difference between these two approaches. How to choose between these two? And what is <code>TypeModel</code> and <code>RuntimeTypeModel</code> in the first place?</p>