正如我最近发现的,我们可以使用两个类 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

最佳答案

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

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

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

关于c# - protobuf-net 中的 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47287522/

10-13 08:31