代码之家  ›  专栏  ›  技术社区  ›  Mykhailo Seniutovych

ProtoBuf之间有什么区别。序列化程序和ProtoBuf。元。protobuf网络中的TypeModel?

  •  3
  • Mykhailo Seniutovych  · 技术社区  · 7 年前

    正如我最近发现的那样,我们可以使用两个类在protobuf网络中序列化/反序列化 ProtoBuf.Serializer ProtoBuf.Meta.TypeModel . 例如,假设我们有一个要序列化/反序列化的自定义类:

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

    这两种方法的区别是什么。如何在这两者之间进行选择?什么是 类型模型 RuntimeTypeModel

    1 回复  |  直到 7 年前
        1
  •  3
  •   Marc Gravell    7 年前

    所有的 Serializer.* 方法是 通常地 只是方便代理 RuntimeTypeModel.Default.*

    本质上,在1*API,有 只有 一个模型。v2增加了描述相同类型的并发/并行模型的能力,以及更丰富的运行时配置系统——所有这些都封装在 TypeModel -和 通常的 正在实施 RuntimeTypeModel 而且 加载包含预烘焙的部件 类型模型 实现,所以不是每个 类型模型 是一个 运行时类型模型 .

    所以如果您使用带有属性的简单类型:使用 序列化程序* . 如果您必须在运行时配置和多个模型方面做更高级的事情,那么您需要跟踪您的各种 类型模型 实例,以便您知道使用哪一个。