在没有它们的情况下解析协议缓冲区数据

Posted

技术标签:

【中文标题】在没有它们的情况下解析协议缓冲区数据【英文标题】:Parsing Protocol Buffer Data Without Them 【发布时间】:2019-05-14 15:00:25 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

当然;您甚至不需要知道 - here's a tool 将尝试在没有任何架构数据的情况下解码未知的 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

额外的“填充/绒毛”,这就是为什么我推荐阅读器/解析器库的原因,但是......它并不那么困难。

【讨论】:

这都是有用的信息!你能告诉我关于那个“绒毛”的解剖结构吗?我正在考虑在没有外部库的情况下解析协议缓冲区创建的流。 @SnailCadet 规范在这里:developers.google.com/protocol-buffers/docs/encoding - 我链接到的网站会进行解码,显示每个字节的含义

以上是关于在没有它们的情况下解析协议缓冲区数据的主要内容,如果未能解决你的问题,请参考以下文章

协议缓冲区扩展和 toString()

Node js peerwire 协议实现

如何解决TCP拆包粘包问题

socket缓冲区以及阻塞模式

邮件传输协议的SMTP命令

php socket 如何实现非阻塞