`

Protocol Buffers - Google's data interchange format

 
阅读更多

http://code.google.com/p/protobuf/

Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats.

 

  • Options

http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/proto.html#options

 

1. java_package (file option): The package you want to use for your generated Java classes.

option java_package = "com.example.foo";

2. java_outer_classname (file option): The class name for the outermost Java class (and hence the file name) you want to generate.

option java_outer_classname = "Ponycopter";

3. optimize_for (file option): Can be set to SPEED , CODE_SIZE , or LITE_RUNTIME .

option optimize_for = CODE_SIZE;

 

http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/reference/java-generated.html

 

  • 根据反编译后的Java文件推导出proto文件

首先看看下面的proto文件生成的Java文件是什么样子的:

package tutorial;

option optimize_for = LITE_RUNTIME;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
  

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
  optional bytes addressBytes = 6;
}

message AddressBook {
  repeated Person person = 1;
}
 

 

枚举类型会生成Java中的枚举:

public enum PhoneType
        implements com.google.protobuf.Internal.EnumLite {
      MOBILE(0, 0),
      HOME(1, 1),
      WORK(2, 2),
      ;
      
      public static final int MOBILE_VALUE = 0;
      public static final int HOME_VALUE = 1;
      public static final int WORK_VALUE = 2;
      ...
}

 注意同时会生成一个以_VALUE作为后缀的常量。

 

下面的三个域生成的Java代码是什么样子呢?

required string name = 1;
required int32 id = 2;
optional string email = 3;

 

首先生成一个接口PersonOrBuilder,有下面的方法:

    boolean hasName();
    String getName();

    boolean hasId();
    int getId();
    
    boolean hasEmail();
    String getEmail();

然后生成Person类,实现接口PersonOrBuilder,同时,定义了下面的常量:

public static final int NAME_FIELD_NUMBER = 1;
public static final int ID_FIELD_NUMBER = 2;
public static final int EMAIL_FIELD_NUMBER = 3;

 可以看出,都有_FIELD_NUMBER后缀。

 

可以从isInitialized()函数中看判断某个域是optional还是required。optional的域不会在isInitialized()中进行检查。

public final boolean isInitialized() {
        if (!hasName()) {
          
          return false;
        }
        if (!hasId()) {
          
          return false;
        }
        ...
}

 

对于域是一个message而不是原始类型的情况,判断是optional还是required有些区别:

比如,对于如下的proto:

optional PhoneNumber mobile = 7;
required PhoneNumber cell = 8;

 对于的Java代码为:

      if (!hasCell()) {
        memoizedIsInitialized = 0;
        return false;
      }
      if (hasMobile()) {
        if (!getMobile().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!getCell().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }

 对于required message field, Java代码中会首先用一个if语句块hasXxx()判断,然后再用一个if语句块getXxx().isInitialized()进行判断,而对于optional message field,两个if语句块会嵌套一起。

 

在initFields()函数中查看具体有哪些fields,再结合XXX_FIELD_NUMBER一起分析。

 

判断extensions:

查看registerAllExtensions()函数。

通常是使用nested extensions,需要好好理解,其实很简单,只是写法有点绕:

http://code.google.com/apis/protocolbuffers/docs/proto.html#extensions
http://code.google.com/apis/protocolbuffers/docs/reference/java-generated.html#extension

 

下面的例子:

public static final int MAN_FIELD_NUMBER = 123;
    public static final
      com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
        com.example.tutorial.AddressBookProtos.Person,
        com.example.tutorial.AddressBookProtos.Man> man = com.google.protobuf.GeneratedMessageLite
            .newSingularGeneratedExtension(
          com.example.tutorial.AddressBookProtos.Person.getDefaultInstance(),
          com.example.tutorial.AddressBookProtos.Man.getDefaultInstance(),
          com.example.tutorial.AddressBookProtos.Man.getDefaultInstance(),
          null,
          123,
          com.google.protobuf.WireFormat.FieldType.MESSAGE);
  }

 可以得知Man是Person的extension,并且field number是123.

 

LazyStringList对应 repeat string xxx = 1;

this change coming up in 2.4.0:
"""Added lazy conversion of UTF-8 encoded strings to String objects to improve
performance."""

 

 

分享到:
评论

相关推荐

    ProtocolBuffers-2.2.0-Source (1).tar.gz

    标题中的"ProtocolBuffers-2.2.0-Source (1).tar.gz"指的是谷歌的Protocol Buffers(简称protobuf)的2.2.0版本源代码压缩包,它以.tar.gz格式打包,这是一种常见的Linux和macOS下的文件压缩方式。这个压缩包可能是...

    前端开源库-protocol-buffers-schema

    Protocol Buffers是一种高效的数据序列化协议,由Google开发,常用于结构化数据的序列化,可以替代XML、JSON等格式,因为它更小、更快、更简单。 **描述详解:** 描述中提到"协议缓冲区模式",这指的是protobuf中...

    ProtocolBuffers-谷歌的数据交换格式

    Protocol Buffers(简称protobuf)是由谷歌公司开发的一种高效、灵活的数据序列化协议,用于在不同系统间进行数据交换。它提供了一种简洁、高效的二进制数据表示方式,使得数据能够在各种语言(如C++、Java、Python...

    protoc-3.19.5-win64.zip

    Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. https://developers.google.com/protocol-buffers/ This package contains a precompiled binary version of the protocol ...

    protocolbuffers-protobuf-v3.12.0.tar.gz

    Protocol Buffers(简称protobuf)是Google开发的一种高效、灵活的数据序列化协议,它允许开发者将结构化的数据序列化,便于存储、通信或者在各种数据处理系统之间交换数据。protobuf不仅独立于语言,还独立于平台,...

    Protocol Buffers - Google的数据交换格式

    protobuf定义了一个结构化的消息格式,并提供了一组工具来生成各种编程语言的代码,使得应用程序可以轻松地创建和解析protobuf消息。同时,protobuf还支持消息的压缩和加密,以及版本兼容和升级等特性,使其在分布式...

    protocol-buffers-schema:没有废话协议缓冲区使用Javascript编写的架构解析器

    协议缓冲区模式 没有废话用Javascript编写的架构解析器 npm install protocol - buffers - schema 用法 首先将以下文件另存为example.proto syntax = "proto2" ;...var schema = require ( 'protocol-buffers-s

    protoc-3.18.0-win64.zip

    Protocol Buffers - Google's data interchange format Copyright 2008 Google Inc. https://developers.google.com/protocol-buffers/ This package contains a precompiled binary version of the protocol ...

    Google Protocol Buffers

    **Google Protocol Buffers**,简称Protobuf,是Google开发的一种数据序列化协议,它能够将结构化的数据序列化,可用于数据存储、通信协议等方面。它提供了比XML更小、更快、更简单的替代方案,可以用于各种编程语言...

    protocol-buffers-encodings-源码.rar

    Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将这些数据结构高效地编码和解码为二进制格式,便于在网络间传输或者存储。protobuf的核心优势在于其小巧、高效...

    protocol buffers 官网中文教程

    Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以视为一种跨平台、跨语言的数据交换格式。它允许开发者定义数据结构,然后生成代码以轻松地在各种数据流之间读写这些数据。Protocol...

    Google Protocol Buffers 源码

    Protocol Buffers are a way of encoding structured data in an efficient yet extensible format. Google uses Protocol Buffers for almost all of its internal RPC protocols and file formats. Latest ...

    Google.ProtocolBuffers.2.4.1.555

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

    Protocol Buffers 2.4.1 jar

    Protocol Buffers 2.4.1 jar

    0001-mod_cgi-buffers-data-without-bound.patch

    lighttpd: fix /usr/lib/mod_cgi.so: undefined symbol: chunkqueue_written

    Protocol-Buffers-Swift-test:使用 Protocol Buffers 和 Swift 进行概念验证

    "Protocol-Buffers-Swift-test" 是一个项目名称,表明这是一个关于使用 Protocol Buffers(谷歌的一种数据序列化协议)与 Swift 语言进行集成和测试的实践项目。"使用 Protocol Buffers 和 Swift 进行概念验证" 描述...

    Protocol Buffers v3.6.0

    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现,如:java、c#、c++、javascript、go 、python、ruby和php等,每一种实现都包含了相应语言的...

    Protocol Buffers v3.0.0-alpha-1(Java)

    Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它类似于XML和JSON,但更加高效、紧凑。protobuf提供了一种结构化的数据存储和通信方式,使得不同语言之间可以轻松地交换数据。在Java环境下...

Global site tag (gtag.js) - Google Analytics