需求分析
先来回顾一下解析PB数据的常规流程:先定义好proto文件,然后使用protoc工具生成java代码,再使用生成的代码里的parseFrom方法去解析PB数据。
有这样一种场景,使用过程中,PB数据定义有变更,比如增删改了字段,常规方法是修改proto文件,重新生成java代码重新打包。那么需求来了,能不能做到做到PB数据字段变更后不打包、仅重启进程就能解析新的数据呢?
解决方案
查看官方文档,发现有这么一个方法:
/** Parse {@code data} as a message of the given type and return it. */
public static DynamicMessage parseFrom(Descriptor type, byte[] data)
throws InvalidProtocolBufferException {
return newBuilder(type).mergeFrom(data).buildParsed();
}
这个方法用来解析PB数据,注意看着两个入参,第二个入参表示PB数据,第一个入参很关键,这是PB数据的描述信息,只要能得到这个Descriptor对象,一切就简单了。
具体做法:
- 在xml中配置PB数据格式来代替.p