Protocol

简介: 【7月更文挑战第20天】

Protocol Buffers 介绍

Protocol Buffers(简称 Protobuf)是一种由 Google 开发的结构化数据序列化机制。它是一种语言中立、平台中立的可扩展机制,用于序列化结构化数据。Protobuf 与 JSON 类似,但更小、更快,并且可以生成原生语言绑定。

Protocol Buffers 的优势

  1. 紧凑的数据存储:Protobuf 的数据存储比 JSON 更紧凑。
  2. 快速解析:Protobuf 的解析速度比 JSON 快。
  3. 多语言支持:Protobuf 支持多种编程语言,如 C++、Java、Python 等。
  4. 向后兼容性:Protobuf 允许在不破坏现有服务的情况下添加新字段或删除现有字段。

使用 Protocol Buffers

1. 定义数据结构

首先,需要在 .proto 文件中定义数据结构。例如,定义一个 Person 消息:

syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}
AI 代码解读

2. 生成代码

使用 Protobuf 编译器 protoc 生成特定语言的代码。例如,生成 Java 代码:

protoc --java_out=. person.proto
AI 代码解读

这将生成 Person.java 文件,包含 Person 类和相关的方法。

3. 使用生成的代码

在 Java 中使用生成的 Person 类:

// Java code
Person john = Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .build();
FileOutputStream output = new FileOutputStream(args[0]);
john.writeTo(output);
AI 代码解读

4. 序列化和反序列化

Protobuf 提供了序列化和反序列化的方法。例如,在 C++ 中:

#include "addressbook.pb.h"

int main(int argc, char* argv[]) {
   
  google::protobuf::AddressBook address_book;
  address_book.add_person()->set_name("John Doe");
  address_book.add_person()->set_name("Jane Doe");

  std::string output;
  address_book.SerializeToString(&output);

  // 反序列化
  google::protobuf::AddressBook parsed_address_book;
  parsed_address_book.ParseFromString(output);

  return 0;
}
AI 代码解读

代码示例

以下是一个简单的 Protobuf 使用示例,展示了如何在 Python 中定义消息并进行序列化和反序列化。

定义 .proto 文件

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
  repeated string hobbies = 3;
}
AI 代码解读

生成 Python 代码

protoc --python_out=. person.proto
AI 代码解读

使用生成的代码

import person_pb2

# 创建消息
person = person_pb2.Person()
person.name = "John Doe"
person.age = 30
person.hobbies.extend(["Reading", "Hiking"])

# 序列化
data = person.SerializeToString()

# 反序列化
new_person = person_pb2.Person()
new_person.ParseFromString(data)
print(new_person.name)  # 输出: John Doe
AI 代码解读
目录
相关文章
SSLHandshakeException: No appropriate protocol
SSLHandshakeException: No appropriate protocol 最近 很多 询问关于 DataGrip或其他JetBrains`家IDE的MySQL数据库配置中报错的问题。具体的报错信息大概是这样的:
2101 0
|
11月前
protocol协议处理
protocol协议
98 0
thriftpy2.protocol.exc.TProtocolException: No protocol version header
thriftpy2.protocol.exc.TProtocolException: No protocol version header
419 0
thriftpy2.protocol.exc.TProtocolException: No protocol version header