协议缓冲区 Java 解析问题
Posted
技术标签:
【中文标题】协议缓冲区 Java 解析问题【英文标题】:Protocol buffer Java parsing issue 【发布时间】:2015-09-15 20:40:00 【问题描述】:我有如下所示的 .Proto 文件
message Port
repeated Info info = 1;
message Info
required string if_name = 1 ;
optional Stats in_stats = 2;
message Stats
required uint64 pkts = 1 ;
repeated Accounting fc_stats = 2;
message Accounting
optional string family = 1 ;
extend Sensors
optional Port InterfaceExt = 7;
我正在解析它,除了 stats 中的“重复”会计元素没有解析正确的数据外,其他一切都运行良好。
此外,Accounting 元素的数组列表大小为零,这意味着它没有正确填充,但是如果我打印传感器对象,它将以原始格式带来数据,如下所示,
info
if_name: "xe"
in_stats
pkts: 27
2: "\n\004IPv4\020\003\030\343\355\277\240e \200\343\355\277\240e"
知道它有什么问题吗?
【问题讨论】:
【参考方案1】:每个字段都需要有唯一的id来区分。
您的pkts
和fc_stats
的ID 都是1
我建议制作其中之一。
注意:它可以将1
解码为pkts
,但它不知道将2
解码为什么。
【讨论】:
@Ammad 我会重新运行你的测试,因为它是字段 id2
它无法解码。
我确实重新运行了,结果相同。我的实际 prorto 文件有 id = 1 和 2。
我同意唯一的解释是 fc_stats
未定义或在任何程序中都没有 ID 2 生成问题中的文本格式输出。确保您已重新生成生成的代码文件并重新编译所有内容。
@PeterLawrey,是的,这就是问题所在。原始文件有正确的编号,但数据的 id 错误,即两个字段的 1,因此能够解码第一行但不能解码 second.info if_name: "xe" in_stats pkts: 27 1: "\n\004IPv4\020\ 003\030\343\355\277\240e \200\343\355\277\240e" 将 2:而不是 1:修复。以上是关于协议缓冲区 Java 解析问题的主要内容,如果未能解决你的问题,请参考以下文章
Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?