news 2026/8/26 14:51:46

Shallows序列化能力清单:JSON、Plist与String存储映射全覆盖指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Shallows序列化能力清单:JSON、Plist与String存储映射全覆盖指南

Shallows序列化能力清单:JSON、Plist与String存储映射全覆盖指南

【免费下载链接】Shallows🛶 Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/Shallows

Shallows 是一个轻量级的 Swift 持久化工具箱(persistence toolbox),它的核心类型Storage<Key, Value>可以通过 7 个便捷的 map 序列化方法,把磁盘上原始的Data直接映射成 JSON、Plist 或 String 等类型安全的存储——本文为你整理这份 JSON、Plist 与 String 存储映射的完整能力清单,帮你快速选对序列化方案。

一、3 秒看懂 Shallows 的序列化模型

Shallows 的设计思路非常简洁,所有序列化都建立在一个统一模型之上:

Data 存储(DiskStorage) │ mapString / mapJSON / mapPlist ▼ 类型安全存储 Storage<Key, 你的类型>
  • 底层:DiskStorage 负责把Data读写到磁盘文件;
  • 序列化层:DiskExtensions.swift 在Value == Data的存储上提供 7 个 map 方法,读取时反序列化、写入时序列化,全程自动完成;
  • 上层:你只需要用强类型的值(比如一个Codable结构体)直接set/retrieve,再也不用手写编码解码逻辑。
let diskStorage = DiskStorage.main.folder("cities", in: .cachesDirectory) .mapJSONObject(City.self) // Storage<Filename, City>,自动 JSON 序列化/反序列化

💡 这 7 个方法定义在extension StorageProtocol where Value == Data上(见 DiskExtensions.swift),所以任何产出Data的存储(磁盘、文件、自定义后端)都可以直接挂上这些序列化能力。

二、Shallows 序列化方法完整清单(一张表看懂)

方法映射结果底层技术默认参数
mapString(withEncoding:)Storage<Key, String>String.Encoding.utf8
mapJSON(readingOptions:writingOptions:)Storage<Key, Any>JSONSerialization空选项
mapJSONDictionary(...)Storage<Key, [String: Any]>JSONSerialization空选项
mapJSONObject(_:decoder:encoder:)Storage<Key, Codable>JSONDecoder/JSONEncoder默认实例
mapPlist(format:readOptions:writeOptions:)Storage<Key, Any>PropertyListSerializationXML 格式
mapPlistDictionary(...)Storage<Key, [String: Any]>PropertyListSerializationXML 格式
mapPlistObject(_:decoder:encoder:)Storage<Key, Codable>PropertyListDecoder/PropertyListEncoder默认实例

每个格式家族都提供3 个粒度级别

  • Any版本mapJSON/mapPlist):最宽松,拿到的是字典/数组等通用对象;
  • 字典版本mapJSONDictionary/mapPlistDictionary):保证值是[String: Any]字典,适合配置项场景;
  • Codable 对象版本mapJSONObject/mapPlistObject):类型最安全,直接映射到你自己的结构体或类。

三、JSON 序列化:3 个方法怎么选

1. 存 Codable 模型:mapJSONObject

适合存储业务模型(如用户信息、城市数据等Codable结构体),可自定义JSONDecoder/JSONEncoder(例如修改日期编码策略):

diskStorage = DiskStorage.main.folder("cities", in: .cachesDirectory) .mapJSONObject(City.self) // 直接存取 City 结构体 diskStorage.set(kharkiv, forKey: "kharkiv") let city = try await diskStorage.retrieve(forKey: "kharkiv")

2. 存键值配置:mapJSONDictionary

适合存 JSON 对象形式的配置(字典)。配合.singleKey还能变成"单键存储"——整个存储只保存一份配置(见 Storage.swift 的singleKey):

let settings = DiskStorage.main.folder("settings", in: .applicationSupportDirectory) .mapJSONDictionary() .singleKey("settings") // Storage<Void, [String : Any]>

3. 通用任意 JSON:mapJSON

最宽松的版本,值可以是任意 JSON 结构(数组、数字、字典均可),代价是返回类型为Any,需要自行类型转换。三个方法均支持传入readingOptions/writingOptions(如JSONSerialization.WritingOptions.prettyPrinted输出格式化 JSON)。

四、Plist 序列化:苹果生态的原生选择

1. 存 Codable 模型:mapPlistObject

mapJSONObject完全对等,只是底层换成PropertyListEncoder/PropertyListDecoder,适合与苹果生态工具(如 Xcode 工程文件、UserDefaults风格配置)互通的场景。

2. 存键值配置:mapPlistDictionary

映射结果为[String: Any]字典,适合.plist风格的设置文件。

3. 通用任意 Plist:mapPlist

⚠️新手注意format参数默认是.xml格式(见 DiskExtensions.swift 的默认值),如果需要二进制 plist 请显式传.binary

let plistStorage = DiskStorage.main.folder("config", in: .applicationSupportDirectory) .mapPlist(format: .binary) // 显式指定二进制格式

五、String 序列化:最轻量的一档

一行代码搞定文本存储:mapString

适合存纯文本、日志片段、小配置字符串等。默认编码为UTF-8,也可换成.ascii.utf16等任意String.Encoding

let strings = DiskStorage.main.folder("strings", in: .cachesDirectory) .mapString(withEncoding: .utf8) .makeSyncStorage() // SyncStorage<String, String>,同步读写 try strings.set("hello".uppercased(), forKey: "hello")

💡 序列化 + 组合是 Shallows 的王牌组合:先把磁盘存储映射成 String/JSON 类型,再与MemoryStorage组合成"内存 + 磁盘"两级缓存,既类型安全又高效。

六、3 步选型:哪种序列化方法最适合你?

  1. Codable模型?→ 首选mapJSONObject(跨平台通用)或mapPlistObject(苹果生态);
  2. 存的是配置字典?→ 用mapJSONDictionary/mapPlistDictionary,还能配合singleKey做单文件配置;
  3. 只是纯文本?→ 直接mapString,一行代码,最轻量。

不确定时记住一个原则:类型越具体越好——优先选Object(Codable)版本 >Dictionary版本 >Any版本,编译期就能帮你挡掉大量错误。

七、源码位置速查

功能文件位置
7 个序列化 map 方法DiskExtensions.swift
磁盘存储实现DiskStorage.swift
Storage 核心类型与 singleKeyStorage.swift
内存存储MemoryStorage.swift
存储组合(combined / backed / pushing)Composition.swift
序列化用法示例XCTest.swift

八、常见问题(FAQ)

Q1:map 方法只能在 DiskStorage 上用吗?不是。这些方法定义在所有Value == Data的存储扩展上,任何基于Data的后端(含自定义实现)都能直接使用。

Q2:mapPlist 默认输出什么格式?默认是 XML 格式 plist。想要二进制格式请显式传format: .binary

Q3:序列化失败会怎样?读取时会抛出带原始数据的DecodingError(见 DiskExtensions.swift),你可以用.fallback(with:).defaulting(to:)给存储加上容错回退,避免单条坏数据导致整个功能不可用。

按这份清单选对序列化方法,Shallows 就能帮你把"磁盘字节 ↔ 强类型值"的繁琐工作全部自动化,让你专注于业务逻辑本身。🛶

【免费下载链接】Shallows🛶 Your lightweight persistence toolbox项目地址: https://gitcode.com/gh_mirrors/sh/Shallows

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 14:51:25

为什么Intel放弃Hyperscan:Vectorscan项目背后的开源反击战

为什么Intel放弃Hyperscan&#xff1a;Vectorscan项目背后的开源反击战 【免费下载链接】vectorscan A portable fork of the high-performance regular expression matching library 项目地址: https://gitcode.com/gh_mirrors/ve/vectorscan Vectorscan 是 Intel 高性…

作者头像 李华
网站建设 2026/8/26 14:48:07

Java面试前,我建议你重点复习这几个核心知识点

面试官的提问看似随机&#xff0c;实则有一张隐形的考点地图。无论你简历上写了多少项目&#xff0c;技术功底都在几个核心知识点上现出原形。我见过太多人栽在“好像知道&#xff0c;但说不深”的陷阱里。这背后的原因很简单&#xff1a;Java面试考察的不是背诵能力&#xff0…

作者头像 李华
网站建设 2026/8/26 14:44:54

谷歌数据分析 V 笔记(二)

进阶应用&#xff1a;计算总利润 &#x1f4c8; 然而&#xff0c;$655 并不是这些厨房用品销售的实际利润&#xff0c;因为我们的计算中还没有包含利润率。利润率是一个百分比&#xff0c;表示每产生一美元的销售额&#xff0c;能带来多少美分的利润。 在我们的数据集中&…

作者头像 李华
网站建设 2026/8/26 14:38:51

2026年口碑出众的表型平台生产厂家盘点,值得你深入了解

做农业科研的朋友应该都懂&#xff1a;选一款合适的植物表型平台&#xff0c;比选实验试剂还头疼——要么仪器和种植场景不搭&#xff0c;要么采集的数据堆成山却不会分析&#xff0c;甚至有些功能只能夜间用&#xff0c;耽误实验进度。2026年市面上的表型平台厂家不少&#xf…

作者头像 李华
网站建设 2026/8/26 14:38:36

3步完成微信聊天记录导出全指南:免费永久保存为HTML和Word

3步完成微信聊天记录导出全指南&#xff1a;免费永久保存为HTML和Word 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

作者头像 李华