前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GRPC: Protocol Buffers 3 语法与使用探讨

GRPC: Protocol Buffers 3 语法与使用探讨

作者头像
运维开发王义杰
发布2024-06-25 08:28:14
880
发布2024-06-25 08:28:14
举报
文章被收录于专栏:运维开发王义杰

引言

Protocol Buffers(简称Protobuf)是一种语言中立、平台中立、可扩展的序列化数据结构的方式。它由Google开发,是一种类似于XML和JSON的数据交换格式,但具有更高的效率和灵活性。在本文中,我们将详细探讨Protocol Buffers 3的语法和使用方法。

1. 什么是Protocol Buffers?

Protocol Buffers是一种用于定义结构化数据的语言。它允许你定义数据结构,然后自动生成用于读写这些结构化数据的代码。与XML和JSON相比,Protobuf更加紧凑和高效,特别适合用于需要高性能和小数据量的场景,如网络通信和数据存储。

2. 安装和设置

在使用Protocol Buffers之前,需要安装Protocol Buffers编译器protoc,以及相应语言的Protobuf库。以下是安装步骤:

install on apple mac
代码语言:javascript
复制

bash
# 安装Protocol Buffers编译器
brew install protobuf
install by winget on windows
代码语言:javascript
复制

powershell
 winget install protobuf --verbose
 Found protobuf [Google.Protobuf] Version 27.1
This application is licensed to you by its owner.
Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
Downloading https://github.com/protocolbuffers/protobuf/releases/download/v27.1/protoc-27.1-win64.zip
  ██████████████████████████████  3.08 MB / 3.08 MB
Successfully verified installer hash
Extracting archive...
Successfully extracted archive
Starting package install...
Command line alias added: "protoc"
Successfully installed

protoc --version
libprotoc 27.1
install by python
代码语言:javascript
复制

bash
# 安装Protobuf Python库
pip install protobuf

3. Protocol Buffers语法

一个Protocol Buffers文件以.proto为扩展名。以下是一个简单的.proto文件示例:

代码语言:javascript
复制

protobuf
syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}
3.1 基本语法
  • syntax = "proto3";:指定语法版本为proto3。
  • message:用于定义一个消息类型。
  • 字段类型:如stringint32
  • 字段标识符:每个字段都有一个唯一的标识符,如123
3.2 字段类型

Protocol Buffers支持多种基本类型:

  • 数值类型:int32int64uint32uint64sint32sint64fixed32fixed64sfixed32sfixed64
  • 浮点数类型:floatdouble
  • 布尔类型:bool
  • 字符串类型:string
  • 字节类型:bytes
3.3 枚举类型

枚举用于定义一组命名常量。

代码语言:javascript
复制

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

4. 使用Protocol Buffers

4.1 编写.proto文件

首先,我们定义一个复杂的.proto文件,包含嵌套消息和枚举:

代码语言:javascript
复制

protobuf
syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  repeated PhoneNumber phones = 4;

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
}
4.2 编译.proto文件

使用protoc编译器生成对应语言的代码:

代码语言:javascript
复制

bash
protoc --python_out=. person.proto

生成的代码示例:

代码语言:javascript
复制

python
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: person.proto
# Protobuf Python Version: 5.27.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
    _runtime_version.Domain.PUBLIC,
    5,
    27,
    1,
    '',
    'person.proto'
)
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()

DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cperson.proto\"\xc3\x01\n\x06Person\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12#\n\x06phones\x18\x04 \x03(\x0b\x32\x13.Person.PhoneNumber\x1a>\n\x0bPhoneNumber\x12\x0e\n\x06number\x18\x01 \x01(\t\x12\x1f\n\x04type\x18\x02 \x01(\x0e\x32\x11.Person.PhoneType\"+\n\tPhoneType\x12\n\n\x06MOBILE\x10\x00\x12\x08\n\x04HOME\x10\x01\x12\x08\n\x04WORK\x10\x02\x62\x06proto3')

_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'person_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
  DESCRIPTOR._loaded_options = None
  _globals['_PERSON']._serialized_start=17
  _globals['_PERSON']._serialized_end=212
  _globals['_PERSON_PHONENUMBER']._serialized_start=105
  _globals['_PERSON_PHONENUMBER']._serialized_end=167
  _globals['_PERSON_PHONETYPE']._serialized_start=169
  _globals['_PERSON_PHONETYPE']._serialized_end=212
# @@protoc_insertion_point(module_scope)
4.3 使用生成的代码

生成的Python代码可以用于序列化和反序列化数据。

代码语言:javascript
复制

python
import person_pb2

# 创建一个Person对象
person = person_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "johndoe@example.com"

# 添加电话号码
phone = person.phones.add()
phone.number = "123-456-7890"
phone.type = person_pb2.Person.MOBILE

# 序列化为二进制数据
data = person.SerializeToString()

# 反序列化
person2 = person_pb2.Person()
person2.ParseFromString(data)

print(person2)

5. Protocol Buffers的优势

  • 高效性:Protobuf的数据格式比XML和JSON更紧凑,解析速度更快。
  • 可扩展性:可以在不破坏现有数据的情况下,添加新的字段。
  • 多语言支持:支持多种编程语言,如C++、Java、Python等。

结论

Protocol Buffers 3是一种强大且高效的数据序列化工具,适用于多种应用场景。在这里我们介绍了Protocol Buffers 3的基本语法和使用方法,希望能帮助大家更好地理解和使用Protobuf。在实际项目中,合理使用Protobuf可以显著提高数据传输和存储的效率。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 1. 什么是Protocol Buffers?
  • 2. 安装和设置
    • install on apple mac
      • install by winget on windows
        • install by python
        • 3. Protocol Buffers语法
          • 3.1 基本语法
            • 3.2 字段类型
              • 3.3 枚举类型
              • 4. 使用Protocol Buffers
                • 4.1 编写.proto文件
                  • 4.2 编译.proto文件
                    • 4.3 使用生成的代码
                    • 5. Protocol Buffers的优势
                    • 结论
                    相关产品与服务
                    数据保险箱
                    数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档