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 是一个非常好的替代选择。