Wire 库介绍
Wire  是 Square 公司开发的一个开源、独立实现的 Protocol Buffers 库,主要用于 Java、Kotlin 和 Swift 平台。
1. 核心定位:为什么需要 Wire?
- 协议缓冲区(Protocol Buffers) :是 Google 推出的一种数据序列化机制,用于高效地序列化结构化数据。它包含一个定义数据结构的模式语言(
.proto文件)和一个紧凑的二进制编码格式。 - 独立实现:虽然 Wire 兼容 Google 的 Protocol Buffers 语法和编码,但它是 Square 从头开始编写的,并非基于 Google 的官方 Java 版本。这使得 Wire 可以做出更适合现代移动端和应用开发的设计决策。
 
2. 主要特点和优势
Wire 的设计哲学强调简洁、清晰和高性能,特别针对 Android 和 Java 平台进行了优化。
- 
简洁生成的代码
- Java :为每个 message 生成一个包含 
public final字段的不可变模型类和一个构建器(Builder)。代码简洁,类似于手写,减少了生成的代码量和运行时开销。 - Kotlin :生成的数据类(data-class-like)使用 
copy方法进行修改,而不是构建器,更符合 Kotlin 习惯。 - Swift :生成结构体(
struct),具有值语义,并符合Equatable,Codable,Sendable等协议。 
 - Java :为每个 message 生成一个包含 
 - 
独特的字段命名规则
- 坚持使用 
.proto文件中声明的原始字段名(如picture_urls),而不是自动转换为驼峰命名(如pictureUrls)。 - 优点 :在 schema、代码和数据之间导航时无需进行名称映射,便于使用 
grep等工具搜索,并提醒开发者这是特殊的数据协议对象。 
 - 坚持使用 
 - 
始终使用装箱类型(对于 Java)
- 所有字段(即使是基本类型)在 Java 中都是对象(如 
String,Integer)。如果字段在编码数据中不存在,其值就是null。 - 优点 :直接支持可选字段和模式演化。对于缺失的字段,可以使用 
Wire.get()工具方法方便地提供默认值。 
 - 所有字段(即使是基本类型)在 Java 中都是对象(如 
 - 
多语言支持
- 第一优先:对 Java、Kotlin 和 Swift 提供成熟的支持。
 - Swift 状态:Swift 支持被视为 "Beta",但已被 Square(Block)在生产环境中使用。
 
 - 
支持 gRPC
- 从 3.0.0 版本开始,Wire 提供了对 gRPC 的支持,可以用于构建客户端和服务器。
 
 - 
模式修剪
- 编译器可以只生成你指定的 message 类型及其依赖项,而不是整个 
.proto文件中的所有内容。这在大型共享 schema 中非常有用,允许客户端只使用它们需要的那一部分。 
 - 编译器可以只生成你指定的 message 类型及其依赖项,而不是整个 
 
3. 不支持的官方 Protocol Buffers 特性
为了保持简洁和高效,Wire 明确不支持一些官方特性:
- Groups(已过时)
 - 大部分自定义选项(除了 message 和 field 上的选项)
 
4. 如何使用
- 
定义 Schema :编写你的
.proto文件。 - 
生成代码:使用 Wire 提供的编译器(可通过 Gradle 插件或命令行使用)来生成对应语言的代码。
 - 
添加依赖:在项目中引入 Wire 的运行时库。
- Maven/Gradle 依赖 :例如 
com.squareup.wire:wire-runtime:4.9.2 
 - Maven/Gradle 依赖 :例如 
 
总结
Wire 是一个高性能、设计理念现代的 Protocol Buffers 实现,它通过生成更简洁、更直观的代码,为 Java、Kotlin 和 Swift 开发者提供了更好的开发体验。 尤其适合那些追求代码简洁性、高性能以及在 Android 和 Java 生态中进行开发的团队。如果你对官方 Protobuf 库的冗长代码或某些设计感到不满,Wire 是一个非常好的替代选择。