菜鸡加懒虫 2016-09-29 09:56 采纳率: 100%
浏览 6854
已采纳

protobuf跨语言传输出错

我是用python作服务器,发送数据到Android客户端。用的是同一个.proto文件分别用--python跟--java指令生成协议,分别添加到python跟Android。
但是Android端一直解析错误,错误提示如下: Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
google了半天没找到正确的解决方法,请大神帮忙看看。以下是代码:

python代码:
entity = SubscribeRespProto_pb2.SubscribeRespProto()
entity.subReqID = 1
entity.userName = "H2901"
entity.productName = "qao"
entity.address = "guangzhou"
content = entity.SerializeToString()
print(str(entity))
proto.transport.write(content)

Android端用的是Netty4.1.5,关键代码如下:
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(eventLoopGroup)
.channel(NioSocketChannel.class)
.option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new ProtobufVarint32FrameDecoder())
.addLast(new ProtobufDecoder(SubscribeReqProto.SubscribeReq.getDefaultInstance()))
.addLast(new ProtobufVarint32LengthFieldPrepender())
.addLast(new ProtobufEncoder())
.addLast(new SubReqClientHandler());
}
});
channelFuture = bootstrap.connect(Constants.IP, Constants.PORT).sync();

.proto文件如下:
message SubscribeRespProto{
required int32 subReqID = 1;
required string userName = 2;
required string productName = 3;
required string address = 4;
}

  • 写回答

2条回答 默认 最新

  • 菜鸡加懒虫 2016-10-12 02:00
    关注

    原来是因为
    .addLast(new ProtobufVarint32FrameDecoder())
    .addLast(new ProtobufVarint32LengthFieldPrepender())
    导致解包错误的。这两句话的意思是 在包头加入32位整型字段,解码的时候用同样方式解码。但是我在python没有对数据头进行加入字段,所以导致解析出错。
    解决办法就是删除这两行或者在python代码加入相同功能的代码即可

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵