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