解析Google Protocol Buffer消息类型的自动反射原理
Google Protocol Buffer(简称protobuf)是Google内部混合语言数据标准,protobuf是一种紧凑的可扩展的二进制消息格式,适合做网络数据传输、数据存储的消息格式。
protobuf作为网络传输的消息格式,有两个问题需要解决:
- 消息长度。protobuf打包的数据没有自带长度信息,需要应用程序自己在发送和接收消息的时候做切分。
- 消息类型。protobuf打包的数据没有自带消息类型,需要由发送方把类型信息传给接收方,接收方再根据收到的消息类型创建具体的Message对象。
第一个问题很好解决,可以在protobuf消息的前面附加一个固定长度的HeaderLen即可。
第二个问题可能很多人会想到在HeaderLen和protobuf消息之间再加上一个消息类型数据段,由接收方根据不同的类型创建相应的Message对象。但其实protobuf已经自带了消息类型反射的功能。
自动反射
Google Protocol Buffer具有reflection的功能,可以根据type name创建相应的类型的Message对象。(下图引用自陈硕的blog)
protobuf自动反射功能的关键所在就是Descriptor了,每个Message对象对应一个相应Descriptor。尽管创建Mesasge对象的过程中没有直接调用Descriptor,但是它却在其中起到了关键桥梁的作用。