使用 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();
但是,这个库是为数据分析和调试而设计的,而不是为生产代码中的对象反序列化而设计的。
我正在处理一些我没有 .proto 定义的 protobuf 编码数据,因此 objects/classes 的 none 是已知的。
protoc
编译器可以使用 protoc --decode_raw
我想做的基本上是使用 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();
但是,这个库是为数据分析和调试而设计的,而不是为生产代码中的对象反序列化而设计的。