![](/img/trans.png)
[英]Protobuf-net creating typemodel with interface and abstract baseclass
[英]What is the difference between ProtoBuf.Serializer and ProtoBuf.Meta.TypeModel in protobuf-net?
正如我最近發現的那樣,我們可以使用兩個類ProtoBuf.Serializer
和ProtoBuf.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);
}
這兩種方法有什么區別。 如何在這兩者之間做出選擇? 什么是TypeModel
和RuntimeTypeModel
?
所有Serializer.*
方法通常只是RuntimeTypeModel.Default.*
便利代理。 可能存在一些小的例外 - 那些根本不觸及模型的例外(例如處理“varint”)
基本上,在1. * API中, 只有一個模型。 v2增加了具有描述相同類型的並發/並行模型的能力,以及更豐富的運行時配置系統 - 所有這些都被封裝到TypeModel
- 通常的實現是RuntimeTypeModel
。 請注意,您還可以加載包含預先烘焙的TypeModel
實現的程序集,因此並非每個TypeModel
都是RuntimeTypeModel
。
所以; 如果你使用帶有屬性的簡單類型:你可以使用Serializer.*
。 如果您必須使用運行時配置和多個模型執行更高級的操作 - 您需要跟蹤各種TypeModel
實例,以便了解要使用的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.