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

来源:互联网 发布:设备报修软件 编辑:程序博客网 时间:2024/06/14 11:14

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时,注意客户端与服务端所采用序列化和反序列化方式,要保持一致!

原创粉丝点击