我正在使用 protobuf-net 库将我们的大型项目中的序列化从 BinarySerializers 转换为 ProtoBuf。
我有一些类,其中成员的类型为
object
,需要一些自定义逻辑来包含类型名称,然后才能再次反序列化为成员。
如果我只使用代理,这非常容易 - 但我担心这会导致不必要的许多分配。
我宁愿只实现一个自定义序列化器,这似乎可以通过
[ProtoContryt(Serializer=typeof(CustomSerializer)]
实现
有关于如何实现这样的序列化器的文档吗?特别是属性
SerializerFeatures
我不是很清楚。
事实是:这是一个高级 API,对于外部用户来说并不是非常友好;它主要是为内部使用而设计的。
SerializerFeatures
描述了广泛的标志,但主要需要的是类别和线类型; 类别告诉它我们正在做什么,而线类型告诉它如何我们计划这样做;对于大多数“消息”类型(意思是:本身可以有子值的东西),您几乎肯定想要SerializerFeatures.WireTypeString | SerializerFeatures.CategoryMessage
,即“这是一条‘消息’,默认使用‘长度前缀’语义进行序列化”(尽管如果需要,每个呼叫站点都可以覆盖线路类型首选项)。
一些 examples 可以在 protobuf-net.Reflection 中使用的自定义序列化器中找到(它需要在不允许 ref-emit 的情况下工作,因此需要自定义序列化器); 例如 - 但是,请注意,大部分代码实际上是通过运行常规 protobuf-net ref-emit 机制生成 dll,然后将该 dll 中的 IL 逆向工程回 C# 来获得的!我这样说是“如果代码看起来很奇怪:那就是原因”。我故意链接到文件中稍微人性化的部分,即它使用
switch
而不是 if
。