首页 > 解决方案 > 在没有它们的情况下解析协议缓冲区数据

问题描述

如果不使用从它编译的 .proto/a 类,序列化的协议缓冲区是否难以解析?

显然,使用 .proto 更容易。我想知道如果没有它们,使用协议缓冲区序列化的数据结构是否可以轻松解析,给定数据的其他一些描述符。即,如果解析我的数据(使用协议缓冲区序列化)的代码知道它需要两个整数和一个布尔值,那么解析这些值是否容易?或者协议缓冲区是否添加了额外的填充/绒毛?

标签: protocol-buffers

解决方案


如果解析我的数据(使用协议缓冲区序列化)的代码知道它需要两个整数和一个布尔值,那么解析这些值是否容易?

当然; 你甚至不需要知道——这是一个工具,它会尝试在没有任何模式数据的情况下解码未知的 protobuf,但有一些警告,一些数据可能不明确。protoc内置了类似的工具。

至于如何从您自己的代码中访问它:这完全取决于您使用的库。如果您使用的库具有原始阅读器/解析器 API(而不仅仅是完整的反序列化器),那么您可以使用它。您还可以定义一个 proto2 原型类型,将所有内容都作为扩展字段,并使用扩展 API。或者,如果您知道特定对象的预期布局,您可以在 .proto 中声明自己的类型,或者甚至不声明。名称不需要匹配,只需匹配字段编号和类型。例如,使用 protobuf-net (.NET) 以下内容适用于您的场景:

class SomeType {
    [ProtoMember(1)] public int A {get;set;}
    [ProtoMember(2)] public int A {get;set;}
    [ProtoMember(3)] public bool A {get;set;}
}
...
var obj = Serializer.Deserialize<SomeType>(source);
Console.WriteLine(obj.A); // int
Console.WriteLine(obj.B); // int
Console.WriteLine(obj.C); // bool

有额外“填充/绒毛”,这就是我推荐阅读器/解析器库的原因,但是......这并不


推荐阅读