[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f12dg7u90dbuul":3},{"code":4,"message":5,"data":6,"timestamp":57},10000,"success",{"full_name":7,"position":8,"description":9,"language":10,"stars":11,"forks":12,"stars_gained":13,"age_days":14,"hn_threads":15,"one_liner":34,"summary_md":35,"topic":36,"github_topics":39,"license":48,"homepage":49,"updated_at":50,"history":51},"protocolbuffers\u002Fprotobuf",10,"Protocol Buffers - Google's data interchange format","C++",72131,16328,3,4442,[16,21,26,30],{"id":17,"title":18,"points":13,"comments":19,"posted_at":20},40470253,"Show HN: Protobuf Editions now available in v27.0",2,"2024-05-24",{"id":22,"title":23,"points":13,"comments":24,"posted_at":25},37098731,"How to learn to use protoc in 21 easily infuriating steps",0,"2023-08-12",{"id":27,"title":28,"points":19,"comments":24,"posted_at":29},42613538,"Μpb: Small, Fast C Protobufs","2025-01-06",{"id":31,"title":32,"points":19,"comments":24,"posted_at":33},22962550,"Proto3 is getting field presence support","2020-04-23","面向需要跨服务、跨语言维护类型化数据契约的团队的 schema 优先序列化格式。","如果你确实要跨服务、跨语言维护一份接口契约，protobuf 值得投入；如果只是写个小脚本或发一次性数据，它不会是首选。这个仓库是 Google 对该格式的官方实现，包含 `protoc` 编译器和各语言运行时。\n\n## 解决什么问题\n\n团队一开始用 JSON：有人写一个 payload，另一个服务读它，字段名靠聊天里说好。一旦字段改名、某个数字在字符串和整数之间摇摆，或者来了一个用别的语言的消费方，不匹配往往到运行时才暴露。用 protobuf 时，schema 写在 `.proto` 文件里，生产方和消费方都从这个文件生成代码。变化发生在 schema 这一步：改文件、为各语言重新生成代码，编译器在部署前就拒绝有问题的定义。你得到的是带类型、可版本化的契约，而不是口头约定。\n\n## 有什么不同\n\nprotobuf 把 schema 和生成代码分开。`protoc` 把 `.proto` 定义变成 C++、Java、Python 等受支持运行时的类型化类，每个服务拿到的是原生访问器，而不是自己解析字节。线格式紧凑且显式版本化：线上传的是字段编号而不是字段名，这正是它可以做增量式 schema 演进的原因。\n\n这个设计有代价。工具链多了一个构建步骤，README 明确说你需要同时装 `protoc` 和对应语言的运行时。C++ 用户要从源码构建，README 还警告 main 分支可能破坏源码兼容性，因而建议固定在 release 分支上的发布提交；其他语言可以直接用 release 里的预编译二进制。跨语言使用还会分散到多个仓库：Go、JavaScript、Dart 各自独立，版本管理并非完全一站式。\n\nEditions 是描述 schema 行为的新方式，v27.0 发布时有人分享了[介绍 Editions 的博客](https:\u002F\u002Fbuf.build\u002Fblog\u002Fprotobuf-editions-are-here)。这应看作一份说明 schema 模型变化的材料，而不是立即迁移的理由。\n\n## 谁值得试\n\n适合：向后端暴露 API、客户端涉及多种语言的团队；或者维护共享事件 schema、希望在生产方和消费方不一致时得到编译期检查的平台组。另一个适合的场景是已经用 Bazel 构建的 C++ 项目，README 记录了 `bazel_dep` 加 Bzlmod 的集成方式以及 WORKSPACE 的接入路径。\n\n不适合：一个人做小服务原型，或者整个数据契约就是一个 JSON、只有一个程序消费的项目。schema 加代码生成的循环在带来收益之前，先增加了文件和构建依赖。\n\n## 使用条件与边界\n\n主要安装成本是编译器与运行时这一对。非 C++ 用户可以从 [releases](https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases) 下载 `protoc-$VERSION-$PLATFORM.zip`，C++ 用户则要按 [C++ 构建说明](https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Fblob\u002Fmain\u002Fsrc\u002FREADME.md) 操作。`protoc` 和运行时的版本混用是实际存在的故障来源，两边都要固定。\n\n长期维护比初次安装更关键。README 的支持策略放在单独的[版本支持页面](https:\u002F\u002Fprotobuf.dev\u002Fversion-support\u002F)，README 也提醒 release 分支在两次发布提交之间可能不稳定。如果你从 main 取源码，就要预期偶发破坏；如果你固定版本，升级节奏得自己规划。\n\n## HotRepo 点评\n\nHotRepo 只记录了 2026-10-24 和 2026-10-25 两天，每天都是 +3 star，且两天都在日榜上。这只是两个带日期的快照，不能说明趋势向上还是向下，也判断不了持久性。对一个这么老的项目，决策不该看热度。真正要在动手前确认的是版本支持页面：你选的运行时还能被支持多久，这比流行度更能决定你的升级负担。",{"slug":37,"name":38},"developer-tools","开发工具",[40,41,42,43,44,45,46,47],"marshalling","protobuf","protobuf-runtime","protoc","protocol-buffers","protocol-compiler","rpc","serialization","NOASSERTION","http:\u002F\u002Fprotobuf.dev","2026-10-25T03:27:33Z",[52,55],{"date":53,"stars":54,"stars_gained":13},"2026-10-24",72128,{"date":56,"stars":11,"stars_gained":13},"2026-10-25",1792909452]