簡體   English   中英

protobuf-net中的ProtoBuf.Serializer和ProtoBuf.Meta.TypeModel有什么區別?

[英]What is the difference between ProtoBuf.Serializer and ProtoBuf.Meta.TypeModel in 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

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

基本上,在1. * API中, 只有一個模型。 v2增加了具有描述相同類型的並發/並行模型的能力,以及更豐富的運行時配置系統 - 所有這些都被封裝到TypeModel - 通常的實現是RuntimeTypeModel 請注意,您還可以加載包含預先烘焙的TypeModel實現的程序集,因此並非每個TypeModel都是RuntimeTypeModel

所以; 如果你使用帶有屬性的簡單類型:你可以使用Serializer.* 如果您必須使用運行時配置和多個模型執行更高級的操作 - 您需要跟蹤各種TypeModel實例,以便了解要使用的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM