Jartap Jartap
首页
  • Protobuf
  • 安装
  • 快速入门
  • 基础语法
  • 枚举(enum)类型
  • 嵌套消息与导入(import)
  • 包(package)与命名空间
  • 选项(options)使用
  • oneof字段
  • map类型
  • 保留字段与保留枚举值
  • 任意类型(Any)
  • 时间戳与持续时间
  • 自定义选项与扩展
  • 编码原理
    • Varint编码
    • 长度前缀编码
    • 消息结构编码
    • 二进制格式解析
  • 性能优化
    • 消息设计最佳实践
    • 减少内存分配的策略
    • 重复字段与打包
    • 性能基准测试与对比
    • 大消息处理技巧

Protobuf 快速入门

语法概览

编写.proto文件

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 results_per_page = 3;
}

Java示例

使用 protoc编译:protoc --java_out=../java/com/example/demo Search.proto;--java-out为相对于 Search.proto的相对路径

Maven依赖

${protobuf-version}版本可以通过编译后的.java文件中注释获取

<!--        ${protobuf-version}版本可以通过编译后的.java文件中注释获取-->
<!--        // Generated by the protocol buffer compiler.  DO NOT EDIT!-->
<!--        // NO CHECKED-IN PROTOBUF GENCODE-->
<!--        // source: Search.proto-->
<!--        // Protobuf Java Version: 4.31.1-->
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>${protobuf-version}</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>${protobuf-version}</version>
</dependency>

验证代码

import com.google.protobuf.InvalidProtocolBufferException;

public class SearchMain {
    public static void main(String[] args) {
        Search.SearchRequest searchRequest = Search.SearchRequest.newBuilder()
                .setQuery("top")
                .setPageNumber(1)
                .setResultsPerPage(10)
                .build();
        byte[] bytes = searchRequest.toByteArray();

        try {
            Search.SearchRequest parsedMessage = Search.SearchRequest.parseFrom(bytes);
            System.out.println("验证成功: " + parsedMessage);
        } catch (InvalidProtocolBufferException e) {
            System.err.println("验证失败: " + e.getMessage());
        }
    }
}