iOS 使用ProtocolBuffer 时报 Protocol message end-group tag did not match expected tag.

Protocol message end-group tag did not match expected tag.

问题

  • iOS给服务端发送PB转换后的串行数据后报异常,详情如下:

    com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
    at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:110)at com.google.protobuf.CodedInputStream$ArrayDecoder.checkLastTagWas(CodedInputStream.java:617)
    at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:165)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:197)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:214)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
    at com.vs.majiang.proto.PersonOuterClass$Person.parseFrom(PersonOuterClass.java:1251)
    at com.vs.majiang.test.ServerDemo5.main(ServerDemo5.java:44)
    

    疯狂搜索无果,回头再看后台发过来的异常日志,Person.parseFrom(PersonOuterClass.java:1251)这行打印忽然意识到一个问题,是不是客户端序列化方式和服务端不一致所致?

    果真如此,ios客户端参考网上博客,使用delimitedData方式序列化数据,同一条数据,传给服务器,打印数据居然不一样!

    于是客户端将序列化方式换成.data,服务端使用parseFrom解析,OK,问题解决!

  • 问题又来了,为什么服务端返回数据给客户端,客户端却无法解析?

    其实问题也是出在解析方式上,将原本`parseDelimitedFromCodedInputStream:extensionRegistry:error` 
    
    改为:`parseFromData:extensionRegistry:error`即可;
    

总结

使用PB时,注意客户端与服务端所采用序列化和反序列化方式,要保持一致!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值