protocol buffer(以下简称PB)作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如
网络传输,配置文件,数据存储等诸多领域。本文的分析基于google发布的源码2.0.1版本
PB的源码结构大致如下:
PB源码
{
PB基础库
{
Message抽象层
Descriptor抽象层
IO子系统
}
PB编译器----源码生成器
}
IO子系统最为简单,不依赖于系统其他部分,实现统一的输入输出接口
Message抽象层主要由一个抽象的Message类和从Message类里面单独分离出来的Reflection类构成.
GeneratedMessageReflection是Reflection的派生类,实现了抽象的Message方法。这里的关键在于
一个静态的offsets_数组,里面存储了任何Message派生类对象里面各个字段相对于对象本身的偏移量。
利用这个偏移量,GeneratedMessageReflection可以在不知道确切字段名字和类型的情况下实现
Reflection里面定义的Message方法
Descriptor抽象层是系统的核心。由平行的两组解释器构成。一组是一系列递归下降的Descriptor类群,
另一组是一系列递归下降的DescriptorProto类群。Descriptor类群描述的是抽象的任意的消息。
DescriptorProto类型是对消息格式本身进行描述的消息。其中FileDescriptorProto类群描述了.proto
文件的结构,任何.proto文件都可以映射到一个FileDescriptorProto对象上。FileDescriptorProto对象
和FileDescriptor之间可以相互转换.
PB编译器实际上是一组递归下降的CodeGenerator类群。Generator的输入是Descriptor类群,输出是
具体的派生消息类
整个编译器的运作过程如下
1 从.proto文件生成FileDescriptorProto对象
2 从FileDescriptorProto对象生成FileDescriptor对象
3 CodeGenerator从FileDescriptor对象生成代码
这里的关键是第一步,相当于常规编译的词法和语法分析,构造解释器的过程。但是看代码我们并没有
发现词法和语法分析过程。google是怎么做到的呢。原来,在Generator里面通过把FileDescriptor转化为
FileDescritorProto,然后SerializeToString序列化后把二进制直接输出到代码中。于是
FileDescriptorProto对象就可以直接从这个二进制通过ParseFromArray构造出来。这里有一个问题,
FileDescriptorProto类本身就是Generator生成的,依赖于Generator,Generator依赖于FileDescriptor,
FileDescriptor依赖于FileDescriptorProto对象,FileDescriptorProto对象又依赖于
FileDescriptorProto类。这就构成了一个循环依赖。这是一个鸡生蛋还是蛋生鸡的问题。其实我们可以
想像,最初的FileDescriptorProto类可以手工构造,然后用这个手工构造的类生成其他派生消息类包括
现在的FileDescriptorProto类。这样,google就把词法和语法分析纳入到了已有的序列化和反序列化
过程中,而不需要单独的其他逻辑。
分享到:
相关推荐
Protocol Buffer(简称protobuf)是Google开发的一种数据序列化协议,它是跨平台、语言无关的,用于结构化数据的高效序列化方法。protobuf提供了一种方式将数据结构定义为.proto文件,然后可以使用protobuf编译器...
Google Protocol Buffer 详细入门Google Protocol Buffer 详细入门
Protocol Buffer 2.5.0 jar包
Protocol Buffer 技术详解(语言规范) Protocol Buffer 是一种语言中立、平台中立、可扩展的序列化数据格式,用于在通信网络和数据存储中交换结构化数据。Protocol Buffer 技术的主要优点是可以在不同的语言和平台...
ProtocolBuffer(简称protobuf)是Google开发的一种数据序列化协议,它是Google开源的一种高效、灵活且跨平台的数据交换格式。在本文中,我们将深入探讨protobuf 2.4.1版本的相关知识点,包括其源码包和安装包的使用...
Protocol Buffer是Google推出的一种数据序列化协议,常用于高效地存储和传输结构化数据。在Cocos2d-x项目中集成Protocol Buffer可以提升游戏的数据交换效率和降低网络通信开销。 标题中的"直接可以用的工程文件...
Protocol Buffer是Google开发的一种数据序列化协议,它提供了一种高效、跨平台的方式来存储和传输结构化数据。Protocol Buffer的主要功能是将复杂的数据结构转换为二进制流,以便在网络中高效地传输或者持久化存储。...
ProtocolBuffer,简称PB,是由Google开发的一种数据序列化协议,它是Google的一种二进制数据交换格式,用于结构化数据的序列化。Protocol Buffers的设计目标是替代XML等传统数据交换格式,提供更高效、更小的数据...
Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并在各种数据平台之间交换这些数据。Sublime Text 3是一款广受欢迎的代码编辑器,拥有丰富的插件库来增强其功能。"Protocol Buffer ...
Protocol Buffer(简称PB)是Google开发的一种数据序列化协议,用于高效地编码和解码结构化数据。它提供了一种跨平台、语言无关的方式,使得应用程序可以方便地存储、交换和解析数据。Protocol Buffer文件(通常扩展...
Then you compile it with protoc, the protocol buffer compiler, to produce code in C++, Java, or Python. Then, if you are using C++, you use that code like this: Person person; person.set_id(123); ...
### Protocol_Buffer官网文档中文版知识点总结 #### 一、简介与概览 - **Protocol Buffer**是一种用于数据序列化的高效工具,支持多种编程语言(如Java、C++、Python等),能够实现数据的有效存储和传输。 #### ...
Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将其转换为二进制格式进行存储或网络传输。Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和...
Google Protocol Buffer(简称Protobuf)是一种由Google开发的跨语言、跨平台的序列化框架,主要用于数据的序列化、反序列化,是一种更灵活、高效、自动化的机制。相比于XML等数据交换格式,Protocol Buffer具有更小...
protocol buffer 在单片机、arm等无操作系统上的工具库 nanopb-0.3.6。Nanopb is a plain-C implementation of Google's Protocol Buffers data format. It is targeted at 32 bit microcontrollers, but is also ...
【Protocol Buffer】是一种高效的数据序列化协议,由Google公司开发并开源。它主要用于结构化数据的描述、传输和存储,其设计目标是提供一种高效、紧凑的二进制数据格式,相比XML和JSON等文本格式,它能显著减少数据...
Protocol Buffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前...
Protocol Buffer是Google开发的一种数据序列化协议,常用于结构化数据的存储和交换。它提供了一种高效、灵活且跨语言的方式,使得不同系统之间能够方便地共享数据。标题中的"Protocol Buffer java版本"指的是...