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

C# 如何获取protobuf网络序列化程序非静态实例?,c#,protobuf-net,C#,Protobuf Net,我使用protobuf网络序列化程序,如下所示: ProtoBuf.Serializer.Serialize(fileStream, data); var myProtobufNetSerializer = MyProtobufNetSerializerFactory(); myProtobufNetSerializer.Serialize(fileStream, data); 如何获取非静态序列化程序实例?我想这样使用它: ProtoBuf.Serializer.Serialize(fil

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

ProtoBuf.Serializer.Serialize(fileStream, data);
var myProtobufNetSerializer = MyProtobufNetSerializerFactory();
myProtobufNetSerializer.Serialize(fileStream, data);
如何获取非静态序列化程序实例?我想这样使用它:

ProtoBuf.Serializer.Serialize(fileStream, data);
var myProtobufNetSerializer = MyProtobufNetSerializerFactory();
myProtobufNetSerializer.Serialize(fileStream, data);
编辑:
protobuf net的作者Marc Gravell在中回答,但我找不到如何…

我的重要问题是,你为什么要这样做?
static
方法实际上只是在默认instanc上公开v1api,即
RuntimeTypeModel.default
。所以我可以回答你的问题,只要:

TypeModel serializer = RuntimeTypeModel.Default;
但是,这样做没有什么好处-您也可以使用
static
方法。但是,如果您想做一些更有趣的事情,那么您可能需要一个自定义模型:

RuntimeTypeModel serializer = RuntimeTypeModel.Create();
// exercise for reader: configure it, store it somewhere, re-use it
由于
TypeModel
(或者更具体地说:
RuntimeTypeModel
)在内部缓存生成的策略,因此您不应该按照所需的序列化创建新的
TypeModel
。如果不必要地继续这样做,将导致效率低下和内存消耗

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

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

您使用的是哪个protobuf序列化程序?@YuvalItzchakov,您的意思是什么版本?2.0.0.668好问题,但我认为这是不可能的。据我所知,该实现只提供静态方法。我可以请你从更广泛的角度来解释一下吗?为什么你需要一个实例?@Marcus,请看我的编辑-作者声称这是可能的。。。有许多用例(单元测试、IoC/DI、扩展方法[如我编辑中提到的问题中所建议的],…)@Marcus这是非常可能的;但这是否合适在很大程度上取决于情景。