Protocol Buffers(ProtoBuf)的详细使用示例
1. 什么是 ProtoBuf?
Protocol Buffers(简称 ProtoBuf)是 Google 开发的一种高效、可扩展的序列化协议,比 JSON、XML 更快、更小,适用于跨语言的数据传输。
2. 示例目标
我们将:
- 定义一个
Person
消息,包含id
、name
和email
。 - 使用 Java 代码序列化
Person
对象到文件。 - 从文件中反序列化
Person
对象,并打印结果。
3. 安装 Protocol Buffers
下载
protoc
编译器- 访问 Protocol Buffers Releases,下载适合你操作系统的
protoc
可执行文件。 - 解压后,把
protoc
加入环境变量。
- 访问 Protocol Buffers Releases,下载适合你操作系统的
添加 Java Protobuf 依赖 如果你使用 Maven,在
pom.xml
添加:xml<dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.24.0</version> </dependency> </dependencies>
4. 编写 .proto
文件
创建 person.proto
:
proto
syntax = "proto3"; // 使用 proto3 语法
package tutorial; // 包名
message Person {
int32 id = 1; // ID
string name = 2; // 姓名
string email = 3; // 邮箱
}
5. 生成 Java 代码
在 person.proto
文件所在目录运行:
sh
protoc --java_out=./src/main/java person.proto
这将在 src/main/java/tutorial/
目录下生成 Person.java
。
6. 编写 Java 代码
6.1 序列化 Person
对象
创建 PersonSerialize.java
:
java
import tutorial.Person;
import java.io.FileOutputStream;
import java.io.IOException;
public class PersonSerialize {
public static void main(String[] args) {
// 1. 创建 Person 对象
Person person = Person.newBuilder()
.setId(1001)
.setName("Alice")
.setEmail("alice@example.com")
.build();
// 2. 序列化到文件
try (FileOutputStream fos = new FileOutputStream("person.dat")) {
person.writeTo(fos);
System.out.println("Person 对象已序列化到 person.dat 文件");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.2 反序列化 Person
对象
创建 PersonDeserialize.java
:
java
import tutorial.Person;
import java.io.FileInputStream;
import java.io.IOException;
public class PersonDeserialize {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("person.dat")) {
// 1. 反序列化
Person person = Person.parseFrom(fis);
// 2. 打印对象内容
System.out.println("反序列化后的 Person:");
System.out.println("ID: " + person.getId());
System.out.println("Name: " + person.getName());
System.out.println("Email: " + person.getEmail());
} catch (IOException e) {
e.printStackTrace();
}
}
}
7. 运行代码
7.1 执行序列化
运行:
sh
javac -cp "protobuf-java-3.24.0.jar" -d . PersonSerialize.java
java -cp ".:protobuf-java-3.24.0.jar" PersonSerialize
输出:
Person 对象已序列化到 person.dat 文件
生成 person.dat
,这是二进制数据,不是可读的。
7.2 执行反序列化
运行:
sh
javac -cp "protobuf-java-3.24.0.jar" -d . PersonDeserialize.java
java -cp ".:protobuf-java-3.24.0.jar" PersonDeserialize
输出:
反序列化后的 Person:
ID: 1001
Name: Alice
Email: alice@example.com
8. 结论
- ProtoBuf 可以高效地序列化和反序列化数据。
- 它的二进制格式比 JSON、XML 更紧凑。
- 可以跨语言使用(C++、Python、Go、Java)。
如果有问题,可以继续讨论!🚀