Mindket

Protocol Buffers 数据序列化

新上架第 2 版 · 更新于
星标72.2k

概览

Google 开源的结构化数据描述方式:在 .proto 文件里描述一次数据的结构,就能用多种语言读写这些数据。安装说明涵盖 protoc 编译器,以及 Python、Java、Kotlin、C#、Ruby、PHP、C++ 等语言的运行时。

Protocol Buffers 数据序列化 是一款 GitHub 上的开源项目,属于开发类,由 Mindket 上架。可免费获取。当前为第 2 版,最近更新于 。按它的 README 从 GitHub 安装。Mindket 的设置说明可在你的 Mindket 账户获取,以 zip 压缩包下载。

速览

用在
  • protoc:适用于任何系统的发布版 zip,或者 apt、Homebrew、winget
  • Python:pip install protobuf
  • Java 和 Kotlin:Maven,安卓上用 Lite 运行时
  • C#:Google.Protobuf 和 Google.Protobuf.Tools 两个 NuGet 包
先运行
apt install -y protobuf-compiler
protoc --version
pip install protobuf

平台

Linux操作系统
macOS操作系统
Windows操作系统
Android操作系统

关于

它是什么

Protocol Buffers,简称 protobuf,是 Google 做的一种与语言和平台无关、可扩展的结构化数据序列化方式。你只需在一个 .proto 文件里描述一次数据。编译器 protoc 把这个文件变成你所用语言的代码,该语言的运行时库再负责写入和读取数据。这个条目提供 protoc 和主仓库里各语言运行时的安装说明,Go、Dart 和 JavaScript 则指向它们各自的仓库。

  1. 你在 .proto 文件里描述数据
  2. protoc 把它变成你所用语言的代码
  3. 你的程序把消息序列化成字节
  4. 另一种语言写的程序解析这些字节
  5. 数据新增字段后,旧代码照常读取

适合谁

在服务之间传递结构化数据,或者把数据存进文件,又想要类型化的模式、紧凑的消息和自动生成的代码的开发者。混用多种语言的团队也合适,比如一个 Java 服务和一个 Python 任务共用同一个 .proto 文件。概览页说,protobuf 最常见的用途是和 gRPC 一起定义通信协议,以及存储数据。如果单条消息超过几兆字节,或者要让人不看 .proto 文件就读懂数据,就不要用它。

谁在用,怎么用
行业谁在用怎么用例子
后端服务服务和任务之间要共享数据的工程师维护一个 .proto 文件,为每种语言生成代码概览页里的情形:一个 Java 程序写出一条消息,另一个平台上的 Python 应用从中读取数值。
服务接口要定义通信协议的团队在 .proto 文件里描述消息和服务,再搭配 gRPC概览页点名 gRPC、Google Cloud 和 Envoy Proxy 是使用 Protobuf 的项目。
数据存储把记录存到磁盘的开发者把消息写进文件,再用同一个生成的类读回来Python 教程里的通讯录用 SerializeToString() 保存一条 AddressBook 消息,再用 ParseFromString() 读回来。
安卓应用安卓开发者使用 Java Lite 运行时,Java README 推荐它是因为代码体积更小一个项目在安卓上使用 Bazel 规则 java_lite_proto_library,README 里就是这么写的。
学习刚接触 protobuf 的人跟着自己所用语言的教程,构建通讯录示例学习者在 examples 文件夹里运行 make python,得到 add_person_python 和 list_people_python。

用在哪里

protoc 可以装在 Linux、macOS 和 Windows 上,运行时覆盖下面这些语言。安装说明涵盖这些,Go、Dart 和 JavaScript 则指向它们各自的仓库。

  • protoc:适用于任何系统的发布版 zip,或者 apt、Homebrew、winget
  • Python:pip install protobuf
  • Java 和 Kotlin:Maven,安卓上用 Lite 运行时
  • C#:Google.Protobuf 和 Google.Protobuf.Tools 两个 NuGet 包
  • Ruby 和 PHP:google-protobuf gem、Composer 和 PECL
  • C++:用 Bazel 或 CMake 构建,Windows 上也可以用 vcpkg
  • Objective-C:把运行时源码加进你的项目
  • Go、Dart 和 JavaScript:README 指向它们各自的仓库

如何设置

点“获取”会把一个装有 Mindket 安装说明的 zip 压缩包存进你的下载文件夹,主仓库文档里的每种运行时各有一页,内容来自制作者的 README 和文档。先装 protoc,再装你所用语言的运行时。

先准备好这些
需要说明
protocGitHub 发布页上的 zip,或者 apt、Homebrew、winget 里的包
运行时你所用语言的包,比如 pip 上的 protobuf
版本一致运行时和 protoc 保持同一版本。Java README 说一致或更新都行,examples README 说 Python 要用同一版本
curl 和 jq只在使用安装页上下载发布版 zip 的那条命令时需要
账号或密钥不需要。安装步骤里没有要求
  1. 安装 protoc,可以用 GitHub 上的发布版 zip,也可以用包管理器。
  2. 运行 protoc --version,并和版本支持页上你所用语言的受支持版本比对,因为包管理器里的 protoc 可能比较旧。
  3. 安装你所用语言的运行时。
  4. 写一个 .proto 文件,再用 protoc 处理它,生成代码。
apt install -y protobuf-compiler
protoc --version
pip install protobuf

前两行是安装页给出的 Linux 路线,第三行安装 Python 运行时。在 Mac 上安装页给的是 brew install protobuf,在 Windows 上是 winget install protobuf,后面各跟一句 protoc --version。没有包管理器的话,从发布页下载适合你系统的 zip,解压到 $HOME/.local 下,再把放着 protoc 的文件夹加进 PATH。安装说明里写了每一条命令。

如何使用

把数据的结构写在一个 .proto 文件里,编译它,再使用生成的类。下面是概览页里的示例消息。

edition = "2023";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

这里的数字是标签。每个字段在二进制编码里都带着自己的标签,Python 教程说 1 到 15 的标签比更大的编号少占一个字节。用教程里的那一行为 Python 编译,它写明了源目录、目标目录和 .proto 路径。

protoc --proto_path=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto

这会在目标文件夹里写出 addressbook_pb2.py。教程接着用 SerializeToString() 写出一条消息,用 ParseFromString(data) 读入一条消息。其他语言换一个选项就行:--java_out、--kotlin_out、--csharp_out、--ruby_out 和 --php_out 是各个 README 提到的几个。

示例

你想要一个能被两种语言读取的文件。examples README 为每种语言做了一个通讯录程序,并说可以用 add_person_java 创建通讯录,再用 list_people_python 读取。

export CLASSPATH=/path/to/protobuf-java-[version].jar
make java
make python

先用 add_person_java 加一个文件名来创建通讯录,再用 list_people_python 加同一个文件名来读取。README 给 C++ 的写法是 ./add_person_cpp addressbook.data,并说 Python 脚本的用法一样。最后得到一个数据文件,两种语言的程序共用。

新手与专家

新手:可以把 .proto 文件想成你数据的一张带类型的表格。protoc 读它,写出一些类,每个字段有一个取值方法和一个设置方法,还有把整条消息变成字节、再变回来的方法。概览页说 Protobuf 像 JSON,只是更小更快。教程假定你对它一无所知,只要求你会用自己的语言写代码和处理文件。教程页有 C++、C#、Dart、Go、Java、Kotlin 和 Python 的版本。

专家:概览页说,删掉的字段,它的编号绝不能再用,所以要把它保留下来。只要你遵守 protobuf.dev 上的更新做法,旧代码读新消息时会忽略新增的字段,新代码读旧消息时,缺少的字段取默认值。同样的数据可以序列化成许多不同的字节串,所以不先解析,就没法比较两条消息是否相等。

Python 有三个后端,API 相同。upb 后端是默认的,随 PyPI 包一起发布,cpp 已弃用,不再在 PyPI 发布,python 是纯 Python 后端。设置 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION 来选一个,运行下面这段代码就能看到你用的是哪个。README 说它不是官方支持的稳定 API,但对临时诊断有用。

from google.protobuf.internal import api_implementation
print(api_implementation.Type())

从源码构建要小心。README 说,main 分支头部的构建时不时会坏,就连发布分支在两次发布提交之间也可能不稳定,所以要固定到某个发布提交。C++ README 警告说,C++ 运行时的两个版本不太可能 ABI 兼容,所以升级后要重新编译,或者静态链接。

注意事项

安装步骤都是普通的装包和构建步骤,其中有几步会连网。

  • 许可证:BSD 风格的文本,有三个条件。LICENSE 文件写的是“Copyright 2008 Google Inc. All rights reserved.”,GitHub 把它列为 Other。结尾一段说,编译器生成的代码归输入文件的所有者所有,并且要链接一个支持库,该库适用同一个许可证
  • 网络:protobuf.dev 上的发布版 zip 命令会访问 api.github.com,并从 GitHub 下载。CMake 构建在没装 Abseil、Google Test 和 jsoncpp 时,会从 GitHub 获取它们。用 git 克隆仓库会从 GitHub 下载,Bazel WORKSPACE 路线里的 http_archive 会从它的 url 下载,go install 会获取 Go 插件。包管理器会访问各自的注册表
  • 版本:预编译的二进制文件只有已发布的版本才有。要用 main 的最新代码,就得自己构建 protoc,旧版本 README 指向 Maven 仓库
  • 适用范围:概览页说 protobuf 不是任何组织的正式标准,所以在法律或其他要求必须基于标准的环境里不适合用。它不压缩消息,用在带大型浮点数组的科学计算上也不太合适
  • 支持:Google 在 2008 年把它开源。概览页说它接受部分拉取请求,但不一定优先处理不符合它自身需求的请求
  • 说明:这些安装说明是 Mindket 写的,Google 没有做过,也没有认可
  • 移除:README 没有给出卸载步骤。用你安装每个部分时用的工具移除它,或者删掉解压出来的发布文件和 PATH 里的那一行

README 和文件

README

Protocol Buffers:安装说明

这个工具包里只有安装说明,由 Mindket 编写。Protocol Buffers,也叫 protobuf,是 Google 的开源项目,要从它自己的仓库安装:https://github.com/protocolbuffers/protobuf

这些说明不是 Google 写的,也没有得到它的认可。README 开头写着“Protocol Buffers - Google's data interchange format”,并说“Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.”,意思是:Protocol Buffers,也叫 protobuf,是 Google 的、与语言和平台无关的、可扩展的结构化数据序列化机制。文档在 https://protobuf.dev 。来源见 https://github.com/protocolbuffers/protobuf/blob/main/README.md

许可证:LICENSE 文件(https://github.com/protocolbuffers/protobuf/blob/main/LICENSE)写的是“Copyright 2008 Google Inc. All rights reserved.”,并包含 BSD 风格许可证的三个条件:在源码里保留版权声明,在随二进制文件提供的文档或其他材料里重现这份声明,没有书面许可不得用 Google 或贡献者的名字为用它做出的产品背书。结尾有一段关于生成代码的话:“Code generated by the Protocol Buffer compiler is owned by the owner of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license.”,意思是:Protocol Buffer 编译器生成的代码归生成时所用输入文件的所有者所有。这段代码不能单独使用,需要链接一个支持库,而这个支持库本身适用上面的许可证。GitHub 的仓库页面把许可证列为“Other”,没有给出 SPDX 名称。

它是什么

一种模式语言、一个编译器和一组运行时库。你把数据的描述写在一个 .proto 文件里。编译器 protoc 把这个文件变成你所用语言的代码。该语言的运行时库负责读写数据。README 说,安装 protobuf 需要两样东西:协议编译器,以及你所选编程语言的 protobuf 运行时。来源见 README.md

各语言的说明在哪里

README 的运行时表格给每种语言指了一个地方。来源见 README.md

会安装什么

分两部分,和 README 说的一样:先装编译器,再装你所用语言的运行时。编译器可以来自发布页上的预编译二进制文件、包管理器,或者用源码构建。运行时来自你所用语言的包管理器,或者用源码构建。下面的说明给出了制作者为每一种做法写的命令。

分平台和语言的说明

  • setup/install-protoc.md:用发布版 zip、apt、Homebrew 或 winget 安装编译器,以及怎么检查它的版本
  • setup/python.md:protobuf 包、三个后端和生成的文件
  • setup/java-and-kotlin.md:protoc 的选项、Maven 依赖、安卓和 Bazel
  • setup/csharp.md:NuGet 包和 --csharp_out 选项
  • setup/ruby-and-php.md:gem、Composer 和 PECL 三条途径,以及 --ruby_out 和 --php_out 选项
  • setup/cpp-bazel-cmake.md:用 Bazel 或 CMake 构建 protoc 和 C++ 运行时,以及在 Bazel 里使用 protobuf
  • setup/other-languages.md:Go、Dart、JavaScript 和 Objective-C,制作者主要在别的仓库里讲它们
  • setup/examples-and-tutorials.md:protobuf.dev 上的教程,以及仓库里的通讯录示例

从源码使用

README 说,大多数用户用受支持的发布版最省事。如果你用 main 分支的最新代码,构建会时不时被不兼容源码的改动和测试不足的行为弄坏。如果你用 C++,或者需要把 protobuf 作为项目的一部分从源码构建,README 说要固定到某个发布分支上的发布提交,因为发布分支在两次发布提交之间也可能不稳定。来源见 README.md

更新或移除

更新编译器的办法和安装时一样:下载更新的发布版 zip,或者用包管理器升级(这是 Mindket 的补充,不是制作者写的)。运行时的版本要和编译器的保持同步:Java README 说要一致或更新,examples README 说 Python 运行时必须和 protoc 是同一个版本,否则可能用不了。README 没有给出卸载步骤。移除发布版 zip 的安装,就删掉你解压出来的文件,以及你加进 PATH 的那一行。移除用包管理器装的包,就用包管理器自己的卸载命令(这是 Mindket 的补充,不是制作者写的)。

对外连接

  • protobuf.dev 上的发布版 zip 命令会访问 https://api.github.com ,并从 GitHub 下载。
  • CMake 构建在没装 Abseil、Google Test 和 jsoncpp 时,会从 GitHub 获取它们。来源见 https://github.com/protocolbuffers/protobuf/blob/main/cmake/README.md
  • 克隆仓库(git clone https://github.com/protocolbuffers/protobuf.git)会从 GitHub 下载,Bazel WORKSPACE 路线里的 http_archive 会从它的 url 下载,go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 会获取 Go 插件。
  • 包管理器、Maven、NuGet、RubyGems、PECL 和 Composer 会访问各自的注册表。

来源

文件
README.md  6 KB
setup/cpp-bazel-cmake.md  6 KB
setup/csharp.md  2 KB
setup/examples-and-tutorials.md  4 KB
setup/install-protoc.md  3 KB
setup/java-and-kotlin.md  4 KB
setup/other-languages.md  3 KB
setup/python.md  4 KB
setup/ruby-and-php.md  4 KB

9 个文件,共 36 KB,以 zip 压缩包下载。

更新内容

  • 第 2 版 · 2026-11-09

    Updated by Mindket to the current version of this kit.

  • 第 1 版 · 2026-11-03

评价

还没有评分

写评价

还没有评价。

大家怎么说

Hacker News、Bluesky、X、Reddit、Facebook 和 YouTube 上提到这个项目的帖子和评论,来自每周一次的搜索和 Trendshift。它们不是 Mindket 写的,也未经核实,点开即可在原帖处阅读。

yashgShow HN: AuthWin – Authenticator App for WindowsI have been using Authy on desktop to generate TOTP for 2FA. Recently got a message that they are shutting down the desktop client. I tried looking for a stand-alone and simple (as simple as Google Authenticator) app for Windows but did not find any, so I built one myself. It can generate…3 分 · 10 条回复GitHub Trending📦 protocolbuffers / protobuf ⭐ 71,880 (+16) 🗒 C++ Protocol Buffers - Google's data interchange format1 赞@the_osps• Protocol Buffers - Google's data interchange format • Written in C++ • Topics: marshalling, protobuf, protobuf-runtimehabermanPython 3.15As a maintainer of a Python module that uses abi3 now, thank you! Just one question: any plans to promote APIs like PyUnstable_EnableTryIncRef() and PyUnstable_TryIncRef() into the limited API? So far we have found that these APIs are necessary to implement the weak-valued caches we've always used…call_user_func📦 google/protobuf v5.37.0RC1 proto library for PHP 🔗 https://github.com/protocolbuffers/protobuf-php@github_trendjpGitHub Trending第7位の https://t.co/LW5FKIfBD0charleslmungerSize-Specialized Memory Allocationhttps://github.com/protocolbuffers/protobuf/commit/50f9ac3ba... On a sufficiently anemic CPU doing enough fast allocation you can get measurable improvements from that kind of thing, but for a superscalar CPU and a general purpose allocator I agree you'd be hard pressed.call_user_func📦 extport/protobuf 36.2.0.1 Unofficial PIE-compatible mirror of protocolbuffers/protobuf 🔗 https://github.com/extport/protobufquietbritishjimProtobuf-py: Protobuf for Python, without compromises> This is a bit in the weeds but inside Google we static link everything which makes is far easier to do it, and static linking is how we recommend you use C++Proto in general. Statically linking everything doesn't work in this case because each C extension module (i.e. each Python package with…Remi's RPM repository⚙️ Bugfix update: - php-pecl-protobuf-5.36.2-1 (PHP 8.2 to 8.5) github.com/protocolbuff... ⏲️ 9' 📦 96charleslmungerTrust your compiler: Modern C++I agree you can't trust your compiler, but you can control its behavior more reliably with __builtin_expect_with_probability https://github.com/protocolbuffers/protobuf/commit/9f29f02a3...SwedenCpp🇸🇪 SwedenCpp.se #Cpp daily: (24h + upcoming) 🎥 5 videos 📝 3 blogs 🚀 3 releases Random 🚀 pick: google/protobuf/v36.2 https://github.com/protocolbuffers/protobuf/releases/tag/v36.2

搜索日期

Mindket 的更多商品

查看 Mindket 的全部商品

Bonsai-27B-GGUF

lmstudio-community · 工具包

面向 LM Studio 的 27B Bonsai 模型 GGUF 转换版,含 3.80 GB 的 Q1_0 语言文件和 0.93 GB 的 BF16 视觉投影器。已测试文本、视觉和并行工具调用。

新上架

以每权重 2.9 位的 EXL3 量化运行 DeepSeek-V4.1-Flash-1017,这是一份 196 GiB 的副本,适合在自己硬件上部署大模型的人。困惑度与原模型相差不大。

新上架

MusicGen Small

facebook · 工具包

根据文字描述或音频提示生成短音乐片段,是 facebook MusicGen 的 small 检查点。适合想在自己电脑上试用文字生成音乐的开发者和音乐爱好者。

新上架

开发类的相似商品

查看开发类的全部商品

Lexnet

alpindale · 工具包

用一个只有约 984 个权重的小型神经网络,为 C 源代码的每个字符打上语法高亮标签,通过一个小小的 C 程序运行。适合对手工设计的网络好奇的开发者和研究者。

新上架

FLUX.2 Klein LoRA Studio

prithivMLmods · 工具包

在浏览器或你自己的电脑上,用一个 Gradio 应用试用 FLUX.2 Klein 图像模型的一组 LoRA。适合制作或测试 AI 图片的人。

新上架

anaksor-ocr

Sokheng · 工具包

这个模型从文档、收据和路牌照片里读取高棉语和英语文字,用一个检测器找文本行,再用识别器读每一行。适合需要在 Python 里做高棉语 OCR 的开发者。

新上架