菜鸡加懒虫 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条)

报告相同问题?

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆