使用知道模式的 protobuf-net 反序列化未知对象

Deserialize unknown object with protobuf-net knowing the schema

我必须解析由 protobuf-net 序列化的未知类型的返回消息。

我已经成功地从原始字节解析回 FileDescriptorSet,我的意思是我知道类型名称,它是字段等。但是如何在不知道消息类型的情况下反序列化消息? 和 Marc 的回答很接近,但我不明白如何使用 Extensible class。

You might need to create a non-abstract class to play with, but class Foo : Extensible {} should suffice, then Serializer.Deserialize(source).

所以我没有“Foo”,我只有 FileDescriptorSet 和消息的序列化字节。我需要在代码中“即时”完成。如何将 FileDescriptorSet 与包含未知消息类型值的字节数组结合起来?

这个问题没有简单的答案,我还没有需要完全实现一个例子。 Extensible 在这里为我们做的唯一一件事就是允许对仍以字节形式存储的临时字段进行基本访问。所以:您可以从数据源中反序列化 Extensible,然后使用 Extensible.GetValue<Type>(obj, fieldNumber) 和 API 的相关重载。您需要根据您对正在查看的 DescriptorProto 自己的 解释来执行此操作(DescriptorProto 是 [=15= 中的一种类型]).例如,您可以枚举 .Fields,并且对于每个:从 .type.TypeName 推断出一些 <T>(您必须解析为另一个 DescriptorProtoEnumDescriptorProto 等)和 .Number(用于标签)。对于任何消息类型,您都可以再次使用 Extensible 并递归地重复该过程。您还需要检查 .Label 以查看它是否重复,如果重复:请改用 Extensible.GetValues<T>

这就是理论。我还没有把它付诸实践的必要。