如何获取protobuf网络序列化程序的非静态实例

本文关键字:程序 序列化 实例 静态 网络 protobuf 何获取 获取 | 更新日期: 2023-09-27 18:25:01

我使用protobuf网络序列化程序,如下所示:

ProtoBuf.Serializer.Serialize(fileStream, data);

如何获得非静态序列化程序实例?我想这样使用它:

var myProtobufNetSerializer = MyProtobufNetSerializerFactory();
myProtobufNetSerializer.Serialize(fileStream, data);

编辑:

protobuf网络的作者Marc Gravell在回答中回答(这个问题)说这是可能的,但我不知道如何。。。

如何获取protobuf网络序列化程序的非静态实例

我的重要问题是为什么要这样做?static方法实际上只是在默认的instanc(也称为RuntimeTypeModel.Default)上公开v1 API。所以我可以用回答你的问题

TypeModel serializer = RuntimeTypeModel.Default;

然而,这样做几乎没有什么好处——您还可以使用static方法。然而,如果你想做一些更有趣的事情,那么你可能想要一个自定义模型:

RuntimeTypeModel serializer = RuntimeTypeModel.Create();
// exercise for reader: configure it, store it somewhere, re-use it

由于TypeModel(或更具体地说:RuntimeTypeModel)在内部缓存生成的策略,因此不应为所需的每个序列化创建新的TypeModel。如果不必要地继续这样做,效率会很低,而且会消耗内存。

您可能不想使用默认类型模型的时间:

  • 您需要同时支持两种不同的不兼容布局(可能是出于版本控制的原因)
  • 您使用的运行时不支持反射发射,并且必须使用预构建的序列化程序类型
  • 您正在对库本身进行单元测试
  • 可能还有一些我不记得了