protobuf-net 中 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 有什么区别?
What is the difference between ProtoBuf.Serializer and ProtoBuf.Meta.TypeModel in protobuf-net?
正如我最近发现的,我们可以 serialize/deserialize 在 protobuf-net 中使用两个 classes ProtoBuf.Serializer
和 ProtoBuf.Meta.TypeModel
。
例如,假设我们有一个自定义 class 我们想要 serialize/deserialize:
[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 添加了描述相同类型的 concurrent/parallel 模型的能力,以及更丰富的运行时配置系统 - 所有这些都封装在 TypeModel
中 - 使用 通常的 实施 RuntimeTypeModel
。请注意,您可以 也 加载包含预烘焙 TypeModel
实现的程序集,因此并非每个 TypeModel
都是 RuntimeTypeModel
.
所以;如果您使用的是具有属性的简单类型:您可以使用 Serializer.*
。如果您必须使用运行时配置和多个模型做更高级的事情 - 您将需要跟踪各种 TypeModel
实例,以便知道使用哪一个。
正如我最近发现的,我们可以 serialize/deserialize 在 protobuf-net 中使用两个 classes ProtoBuf.Serializer
和 ProtoBuf.Meta.TypeModel
。
例如,假设我们有一个自定义 class 我们想要 serialize/deserialize:
[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 添加了描述相同类型的 concurrent/parallel 模型的能力,以及更丰富的运行时配置系统 - 所有这些都封装在 TypeModel
中 - 使用 通常的 实施 RuntimeTypeModel
。请注意,您可以 也 加载包含预烘焙 TypeModel
实现的程序集,因此并非每个 TypeModel
都是 RuntimeTypeModel
.
所以;如果您使用的是具有属性的简单类型:您可以使用 Serializer.*
。如果您必须使用运行时配置和多个模型做更高级的事情 - 您将需要跟踪各种 TypeModel
实例,以便知道使用哪一个。