正如我最近发现的,我们可以使用两个类 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.*
的便利代理。可能有一些小的异常(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/