如何在protobuf-net中编写自定义ISerializer

问题描述 投票:0回答:1

我正在使用 protobuf-net 库将我们的大型项目中的序列化从 BinarySerializers 转换为 ProtoBuf。

我有一些类,其中成员的类型为

object
,需要一些自定义逻辑来包含类型名称,然后才能再次反序列化为成员。

如果我只使用代理,这非常容易 - 但我担心这会导致不必要的许多分配。

我宁愿只实现一个自定义序列化器,这似乎可以通过

[ProtoContryt(Serializer=typeof(CustomSerializer)]

实现

有关于如何实现这样的序列化器的文档吗?特别是属性

SerializerFeatures
我不是很清楚。

protobuf-net
1个回答
0
投票

事实是:这是一个高级 API,对于外部用户来说并不是非常友好;它主要是为内部使用而设计的。

SerializerFeatures
描述了广泛的标志,但主要需要的是类别线类型类别告诉它我们正在做什么,而线类型告诉它如何我们计划这样做;对于大多数“消息”类型(意思是:本身可以有子值的东西),您几乎肯定想要
SerializerFeatures.WireTypeString | SerializerFeatures.CategoryMessage
,即“这是一条‘消息’,默认使用‘长度前缀’语义进行序列化”(尽管如果需要,每个呼叫站点都可以覆盖线路类型首选项)。

一些 examples 可以在 protobuf-net.Reflection 中使用的自定义序列化器中找到(它需要在不允许 ref-emit 的情况下工作,因此需要自定义序列化器); 例如 - 但是,请注意,大部分代码实际上是通过运行常规 protobuf-net ref-emit 机制生成 dll,然后将该 dll 中的 IL 逆向工程回 C# 来获得的!我这样说是“如果代码看起来很奇怪:那就是原因”。我故意链接到文件中稍微人性化的部分,即它使用

switch
而不是
if

© www.soinside.com 2019 - 2024. All rights reserved.