主要观点:
- 正在努力规划 Swift 中序列化与反序列化 API 的未来,
Codable
虽成功但不能满足一些重要需求,目标是在不牺牲易用性的前提下提高性能。 - 需设计新 API 以突破
Codable
的性能瓶颈,如避免使用存在类型、优化容器解析等。 - 借鉴 Rust 的 Serde 设计以提升性能,其使用访问者模式、避免动态类型转换等。
- 利用宏依赖减少手动实现的需求,像 Serde 那样通过宏生成序列化代码,并在 Swift 中实现更全面的定制。
- 采用双协议方法,既有格式无关协议又有格式特定协议,以实现兼容性和高性能。
- 新 API 应与
Codable
兼容,鼓励编码器和解码器接受新协议和Codable
类型。 - 明确非目标,如聚焦常见格式、代码中定义所有内容、不支持循环对象图等。
- 给出示例展示宏注释类型及其扩展后的代码。
关键信息:
- 现有
Codable
API 存在性能问题,如使用存在类型、容器解析开销等。 - Rust 的 Serde 设计避免了这些问题,其访问者模式可优化性能且能借用数据。
- Swift 可借鉴 Serde 的宏设计实现更灵活的定制,同时避免编译器实现的困难。
- 双协议方法可兼顾兼容性和高性能,格式特定协议可针对特定格式优化。
- 新 API 要与
Codable
兼容,通过通用编码器和解码器实现。
重要细节:
JSONDecoder
优化工作中发现所有容器都需提前解析负载。- Serde 的访问者模式可按顺序提供键值给客户端,避免中间表示。
- Swift 中手动实现
Codable
较繁琐,宏可作为定制机制。 - 不同格式的序列化需各自提供主宏。
- 示例中展示了宏注释的
BlogPost
类型及其扩展后的编码和解码代码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。