博客
关于我
Protobuf - 语法、字段使用规则、注意事项
阅读量:796 次
发布时间:2023-03-04

本文共 2188 字,大约阅读时间需要 7 分钟。

Protobuf 开发指南:核心语法与实践

目录


前言

在之前的文章中,我们讨论过 gRPC 的实现细节,提到了 Protobuf 的基本语法。然而,Protobuf 的世界远不止这些。它的语法复杂,存在许多容易出错的地方。本文将深入探讨 Protobuf 的核心语法,帮助开发者避免常见的误区,全面掌握 Protobuf 的使用方法。


一、Protobuf 基本语法

1.1 Protobuf 版本

Protobuf 的版本选择对开发有重要影响。当前主流版本为 Protobuf 3,与 Protobuf 2 有显著差异。理解这些差异是避免后续开发问题的关键。

在你的项目根目录下,创建或更新 protbuf 文件,确保开头包含以下内容:

syntax = "proto3";

这一行声明了你使用的 Protobuf 版本。

1.2 文件格式配置

每个 Protobuf 文件的开头应包含以下配置选项:

基本配置

option java_multiple_files = false; // 生成单个 Java 文件option java_package = "com.example"; // 包名option java_outer_classname = "YourProto"; // 生成的外部类名

导入

如果你的项目依赖其他 Protobuf 文件(如第三方库或自定义文件),需要在文件开头导入:

import "path/to/your/dependency.proto";

1.3 消息字段规则

消息字段的定义是 Protobuf 开发的核心部分。理解以下规则是避免常见错误的关键。

1.3.1 字段数据类型

Protobuf 支持多种数据类型,以下是常见类型及其对应的 Java/Kotlin 类型:

Protobuf Type Java/Kotlin Type
double double
float float
int32 int
int64 long
uint32 int
uint64 long
bool boolean
string String
bytes ByteString

1.3.2 字段修饰规则

字段可以通过修饰符进一步定义:

  • repeated:表示该字段是一个列表。
    repeated string phones = 3;
  • singular(默认):字段只能是 null 或一个具体值。

1.3.3 消息类型定义

消息类型可以嵌套定义,支持复杂结构:

message User {  string name = 1;  int32 age = 2;  repeated string phones = 3;  message Address {    string street = 1;    string city = 2;  }  UserAddress address = 4;}

1.3.4 枚举类型

枚举类型用于表示有限的状态值,第一值必须为 0:

enum Status {  NORMAL = 0;  PRIVATE = 1;  TIMER = 2;}

1.3.5 Any 类型

Any 类型用于存储任意消息类型,适用于动态数据:

import "google/protobuf/any.proto";message Data {  string name = 1;  google.protobuf.Any data = 2;}

1.3.6 oneof 类型

oneof 类型用于表示只能有一个字段被设置:

message Content {  oneof content {    string text = "text";    string image = "image";  }}

1.3.7 map 类型

map 类型类似于 HashMap,支持键值对:

map
arguments = 7;

1.3.8 默认值

字段默认值根据类型不同:

  • 字符串:空字符串
  • 数值类型:0
  • 布尔:false
  • 枚举:第一个枚举值

1.3.9 更新消息规则

在更新消息类型时,遵守以下规则:

  • 禁止修改字段编号
  • 删除字段时保留编号
  • 注意类型兼容性
  • 1.3.10 保留字段

    保留字段用于避免编号冲突:

    reserved 42;

    1.3.11 选项 optional

    在 Protobuf 2 中,optional 是一个字段修饰符。但在 Protobuf 3 中,所有字段都是可选的。


    总结

    通过以上内容,你应该对 Protobuf 的核心语法有了全面的了解。理解这些规则是开发高效、可靠 Protobuf 服务的关键。接下来,你可以根据实际需求,结合以上内容,开始你的 Protobuf 开发之旅!

    转载地址:http://mrxfk.baihongyu.com/

    你可能感兴趣的文章
    poi-tl简介与文本/表格和图片渲染
    查看>>
    pointnet分割自己的点云数据_PointNet解析
    查看>>
    POI实现Excel导入Cannot get a text value from a numeric cell
    查看>>
    POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
    查看>>
    POI实现Excel导出时常用方法说明
    查看>>
    POI导出Excel2003
    查看>>
    POI数据获取及坐标纠偏
    查看>>
    Quartz入门看这一篇文章就够了
    查看>>
    POI解析Excel【poi的坑——空行处理】
    查看>>
    POI:POI+JXL实现xls文件添加水印
    查看>>
    POI:POI实现docx文件添加水印
    查看>>
    POJ 1006
    查看>>
    Quartz中时间表达式的设置-----corn表达式
    查看>>
    poj 1035
    查看>>
    POJ 1061 青蛙的约会 (扩展欧几里得)
    查看>>
    Quartz2.2.1简单使用
    查看>>
    POJ 1080 Human Gene Functions(DP:LCS)
    查看>>
    Quant 开源项目教程
    查看>>
    POJ 1088 滑雪
    查看>>
    POJ 1095 Trees Made to Order
    查看>>