使用 protobuf-net 反序列化完全未知的对象

Deserialise completely unknown object with protobuf-net

我正在处理一些我没有 .proto 定义的 protobuf 编码数据,因此 objects/classes 的 none 是已知的。

protoc 编译器可以使用 protoc --decode_raw

为任何给定的 protobuf 编码数据生成通用模板样式输出

我想做的基本上是使用 probuf-net 生成类似的通用输出模板。但是我不确定这是否可行?

所以我只想将编码数据反序列化为一个通用对象,其中包含其他通用对象。

这可能吗?

这里的问题是:protobuf格式不明确;在不知道架构的情况下,不存在 single/reliable 解释数据的方法。完全相同的字节可以有许多不同的含义。 --decode_raw 所做的只是做出一些 猜测 ;您可以通过 ProtoReader API 或 using this handy decoder 对 protobuf-net 进行类似的猜测,但是:您不能像使用 JSON 或 XML.

在 protobuf-net 中有 APIs 用于处理 unknown/unexpected 字段,当然:你可以创建一个对象,其中 everything 是出乎意料的,但这并不能真正帮助你,因为你仍然需要实际 解释 每个字段,如果不了解架构,你将无法做到这一点。

最终,protobuf(二进制格式,不是任何特定的库)不适合您想在这里做的事情。

尽管 protobuf 没有设计为在没有模式的情况下进行解码,但您仍然可以读取字段编号、线路类型和原始字段值。

您可以使用基于 protobuf-net 的 ProtoUntyped 库提取此信息:

var protoObject = ProtoObject.Decode(bytes);
var dictionary = protoObject.ToFieldDictionary();

但是,这个库是为数据分析和调试而设计的,而不是为生产代码中的对象反序列化而设计的。