protobuf-net 中 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 有什么区别?

What is the difference between ProtoBuf.Serializer and ProtoBuf.Meta.TypeModel in protobuf-net?

正如我最近发现的,我们可以 serialize/deserialize 在 protobuf-net 中使用两个 classes ProtoBuf.SerializerProtoBuf.Meta.TypeModel。 例如,假设我们有一个自定义 class 我们想要 serialize/deserialize:

[ProtoContract]
public class Person
{
    [ProtoMember(1)]
    public string Name { get; set; }
    [ProtoMember(2)]
    public int Age { get; set; }
}

我们可以通过两种方式实现:

1) 使用 TypeModel

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));
}

2) 使用Serializer(这是我见过的大多数教程中选择的方式)

var person1 = new Person
{
    Name = "John",
    Age = 23
};
using (var stream = new MemoryStream())
{
    Serializer.Serialize(stream, person1);
    stream.Position = 0;
    var pesrson2 = Serializer.Deserialize<Person>(stream);
}

这两种方法有什么区别。这两者如何选择? TypeModelRuntimeTypeModel 首先是什么?

所有 Serializer.* 方法 通常 只是 RuntimeTypeModel.Default.* 的便利代理。可能有一些小例外 - 那些根本不接触模型(例如处理 "varint")

基本上,在 1.* API 中,只有 一个模型。 v2 添加了描述相同类型的 concurrent/parallel 模型的能力,以及更丰富的运行时配置系统 - 所有这些都封装在 TypeModel 中 - 使用 通常的 实施 RuntimeTypeModel。请注意,您可以 加载包含预烘焙 TypeModel 实现的程序集,因此并非每个 TypeModel 都是 RuntimeTypeModel.

所以;如果您使用的是具有属性的简单类型:您可以使用 Serializer.*。如果您必须使用运行时配置和多个模型做更高级的事情 - 您将需要跟踪各种 TypeModel 实例,以便知道使用哪一个。