协议缓冲区 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来区分。

您的pktsfc_stats 的ID 都是1

我建议制作其中之一。

注意:它可以将1 解码为pkts,但它不知道将2 解码为什么。

【讨论】:

@Ammad 我会重新运行你的测试,因为它是字段 id 2 它无法解码。 我确实重新运行了,结果相同。我的实际 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 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

协议缓冲区扩展和 toString()

在 C# 中解析原始协议缓冲区字节流

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

红外协议解析

google 的从 c# 到 java 的协议缓冲区 - 协议消息标签的线路类型无效