正如我最近发现的,我们可以使用两个类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
是什么?
答案 0 :(得分:2)
所有Serializer.*
方法通常只是RuntimeTypeModel.Default.*
的便利代理。可能有一些小的例外 - 那些根本不触及模型的例外(例如处理“varint”)
基本上,在1. * API中,只有 一个模型。 v2添加了具有描述相同类型的并发/并行模型的能力,以及更丰富的运行时配置系统 - 所有这些都封装在TypeModel
中 - 通常的实现为{{1 }}。请注意,您还可以加载包含预先制作的RuntimeTypeModel
实施的程序集,因此并非每个TypeModel
都是TypeModel
。
因此;如果你使用带有属性的简单类型:你可以使用RuntimeTypeModel
。如果您必须使用运行时配置和多个模型执行更高级的操作 - 您需要跟踪各种Serializer.*
实例,以便了解要使用的实例。