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

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 powerbuilder出现这样的报错
  • ¥15 h3.6m 人类行为预测论文复现
  • ¥50 wordpress项目注册报失败刷新后其实是成功状态,请求排查原因
  • ¥20 linxu服务器僵尸进程不释放,代码如何修改?
  • ¥15 pycharm激活不成功
  • ¥40 如果update 一个列名为参数的value
  • ¥15 基于51单片机的水位检测系统设计中LCD1602一直不显示
  • ¥15 OCS2安装出现问题,请大家给点意见
  • ¥15 ros小车启动launch文件报错
  • ¥15 vs2015到期想登陆但是登陆不上