跳转到内容

Protocol Buffers(ProtoBuf)的详细使用示例


1. 什么是 ProtoBuf?

Protocol Buffers(简称 ProtoBuf)是 Google 开发的一种高效可扩展的序列化协议,比 JSON、XML 更快、更小,适用于跨语言的数据传输。


2. 示例目标

我们将:

  1. 定义一个 Person 消息,包含 idnameemail
  2. 使用 Java 代码序列化 Person 对象到文件
  3. 从文件中反序列化 Person 对象,并打印结果。

3. 安装 Protocol Buffers

  1. 下载 protoc 编译器

    • 访问 Protocol Buffers Releases,下载适合你操作系统的 protoc 可执行文件。
    • 解压后,把 protoc 加入环境变量。
  2. 添加 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)

如果有问题,可以继续讨论!🚀

make it come true