Protocol Buffer
Protocol Buffer

Protocol Buffer

Category
技术分享 Tech
Author
Huilin Zhang
Date
Nov 26, 2024

定义

Protocol Buffer(简称 Protobuf)是由 Google 开发的一种高效的序列化数据格式,主要用于在不同系统之间进行数据交换。它是一种轻量级的、跨平台的、语言无关的机制,广泛用于分布式系统和网络通信中。
  • 核心特点
    • 特性
      Protobuf
      JSON
      XML
      效率
      数据大小
      可读性
      差(需工具解析)
      好(文本格式)
      好(文本格式)
      灵活性
      强类型支持
    • 高效
      • 比 JSON 或 XML 更紧凑,占用的空间更少。
      • 序列化和反序列化速度更快。
    • 跨语言支持
      • Protobuf 支持多种编程语言(如 C++、Java、Python、Go 等)。
      • 定义一次协议文件后,可以自动生成各种语言的代码。
    • 易扩展
      • 可以为消息添加新字段,而不破坏与旧代码的兼容性(向后兼容性)。
      • 未知字段会被忽略,这样即使不同版本的程序也能正常通信。
    • 强类型
      • Protobuf是强类型的,字段的类型在定义时就固定了,减少了运行时错误的可能性。

使用方式

  1. 安装Protobuf:
    1. protobuf
      protocolbuffersUpdated Nov 26, 2024
      通过这个命令检查是否已安装Protobuf,以及Protobuf的版本。
      protoc --version
  1. 定义协议文件(.proto 文件):协议文件用于描述数据结构,例如:
    1. syntax = "proto3"; // 使用 Protobuf 版本 3 message Person { int32 id = 1; // 唯一 ID string name = 2; // 姓名 string email = 3; // 邮箱 }
  1. 生成代码:使用 Protobuf 编译器 protoc,根据 .proto 文件生成目标语言的代码。例如:
    1. protoc --python_out=. person.proto
      上述命令会生成Python的类文件。
  1. 序列化和反序列化:在代码中使用生成的类:
    1. from person_pb2 import Person # 创建消息对象 person = Person(id=123, name="Alice", email="alice@example.com") # 序列化为二进制 serialized_data = person.SerializeToString() # 反序列化为对象 new_person = Person() new_person.ParseFromString(serialized_data) print(new_person)

使用场景

  • 网络通信:在微服务或分布式系统中,用作高效的数据交换格式。
  • 数据存储:在需要紧凑存储格式的场景下,用作日志或配置文件的存储(例如手机的配置文件,即在高性能场景中进行数据交换)。
  • 配置管理:通过 Protobuf 定义和解析复杂的配置文件。