`
tmrp
  • 浏览: 44767 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

google protocol buffer 源码简析

阅读更多
  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

    Protocol Buffer(简称protobuf)是Google开发的一种数据序列化协议,它是跨平台、语言无关的,用于结构化数据的高效序列化方法。protobuf提供了一种方式将数据结构定义为.proto文件,然后可以使用protobuf编译器...

    Google Protocol Buffer 详细入门

    Google Protocol Buffer 详细入门Google Protocol Buffer 详细入门

    google Protocol Buffer2.5.0.jar

    Protocol Buffer 2.5.0 jar包

    01 Protocol Buffer技术详解(语言规范).doc

    Protocol Buffer 技术详解(语言规范) Protocol Buffer 是一种语言中立、平台中立、可扩展的序列化数据格式,用于在通信网络和数据存储中交换结构化数据。Protocol Buffer 技术的主要优点是可以在不同的语言和平台...

    ProtocolBuffer2.4.1源码包及安装包

    ProtocolBuffer(简称protobuf)是Google开发的一种数据序列化协议,它是Google开源的一种高效、灵活且跨平台的数据交换格式。在本文中,我们将深入探讨protobuf 2.4.1版本的相关知识点,包括其源码包和安装包的使用...

    cocos2d-x protocol buffer 直接可以用的工程文件。

    Protocol Buffer是Google推出的一种数据序列化协议,常用于高效地存储和传输结构化数据。在Cocos2d-x项目中集成Protocol Buffer可以提升游戏的数据交换效率和降低网络通信开销。 标题中的"直接可以用的工程文件...

    Protocol Buffer

    Protocol Buffer是Google开发的一种数据序列化协议,它提供了一种高效、跨平台的方式来存储和传输结构化数据。Protocol Buffer的主要功能是将复杂的数据结构转换为二进制流,以便在网络中高效地传输或者持久化存储。...

    protocolbuffer

    ProtocolBuffer,简称PB,是由Google开发的一种数据序列化协议,它是Google的一种二进制数据交换格式,用于结构化数据的序列化。Protocol Buffers的设计目标是替代XML等传统数据交换格式,提供更高效、更小的数据...

    Protocol Buffer sublime text 3插件

    Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并在各种数据平台之间交换这些数据。Sublime Text 3是一款广受欢迎的代码编辑器,拥有丰富的插件库来增强其功能。"Protocol Buffer ...

    Protocol Buffer编译工具包

    Protocol Buffer(简称PB)是Google开发的一种数据序列化协议,用于高效地编码和解码结构化数据。它提供了一种跨平台、语言无关的方式,使得应用程序可以方便地存储、交换和解析数据。Protocol Buffer文件(通常扩展...

    Google Protocol Buffers 源码

    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官网文档中文版知识点总结 #### 一、简介与概览 - **Protocol Buffer**是一种用于数据序列化的高效工具,支持多种编程语言(如Java、C++、Python等),能够实现数据的有效存储和传输。 #### ...

    Protocol Buffer 3.0 C++

    Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将其转换为二进制格式进行存储或网络传输。Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和...

    Google protocol buffer 开发指南

    Google Protocol Buffer(简称Protobuf)是一种由Google开发的跨语言、跨平台的序列化框架,主要用于数据的序列化、反序列化,是一种更灵活、高效、自动化的机制。相比于XML等数据交换格式,Protocol Buffer具有更小...

    protocol buffer 在单片机、arm等无操作系统上的工具库 nanopb-0.3.6

    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 ...

    ProtocolBuffer

    【Protocol Buffer】是一种高效的数据序列化协议,由Google公司开发并开源。它主要用于结构化数据的描述、传输和存储,其设计目标是提供一种高效、紧凑的二进制数据格式,相比XML和JSON等文本格式,它能显著减少数据...

    Google Protocol Buffer 的使用和原理.pdf

    Protocol Buffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前...

    Protocol Buffer java版本

    Protocol Buffer是Google开发的一种数据序列化协议,常用于结构化数据的存储和交换。它提供了一种高效、灵活且跨语言的方式,使得不同系统之间能够方便地共享数据。标题中的"Protocol Buffer java版本"指的是...

Global site tag (gtag.js) - Google Analytics