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

时间:2017-11-14 13:50:13

标签: c# protocol-buffers protobuf-net

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

[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是什么?

1 个答案:

答案 0 :(得分:2)

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

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

因此;如果你使用带有属性的简单类型:你可以使用RuntimeTypeModel。如果您必须使用运行时配置和多个模型执行更高级的操作 - 您需要跟踪各种Serializer.*实例,以便了解要使用的实例。