1

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

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

您可能需要创建一个非抽象类来玩,但 class Foo : Extensible {} 就足够了,然后是 Serializer.Deserialize(source)。

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

4

1 回答 1

1

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

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

于 2021-04-21T12:29:20.773 回答