gpt4 book ai didi

c# - protobuf-net 中的 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 15:56:12 29 4
gpt4 key购买 nike

正如我最近发现的,我们可以使用两个类 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.* 的便利代理。可能有一些小异常(exception) - 那些根本不涉及模型的异常(exception)(例如处理“varint”)

本质上,在 1.* API 中,只有一个模型。 v2 添加了描述相同类型的并发/并行模型的能力,以及更丰富的运行时配置系统——所有这些都封装到 TypeModel 中——通常实现是运行时类型模型。请注意,您可以加载包含预制TypeModel 实现的程序集,因此并非每个TypeModel 都是RuntimeTypeModel .

所以;如果您使用的是带有属性的简单类型:您可以使用 Serializer.*。如果您不得不使用运行时配置和多个模型做更高级的事情 - 您将需要跟踪各种 TypeModel 实例,以便知道使用哪个。

关于c# - protobuf-net 中的 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47287522/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com