QJSON 4.0 目录已经处于基本可用状态,可以供大家在新的开发项目中试用,就目前版本来说,4.0 相比 3.0 版有以下大不同:
- 架构变化
- 3.0 版 TQJson 是一个类 (class),4.0 版是一个记录类型 (record) 并且改名为 TQJsonNode 以避免和 3.0 版本冲突
- 4.0 版实现了 IQSerializeReader 和 IQSerializeWriter 接口,可以统一多种格式的序列化和反序列化
- 4.0 版将支持 Free Pascal 3.3.1 + 版本,3.0 版本不支持
- 内存管理
- 4.0 支持字符串缓存模式,重复的字符串内容,只会保存一个版本
- 4.0 使用双向链表而不是数组来存储同级的兄弟结点,分配内存次数相比数组模式更少
- 4.0 支持按数组方式访问,但如果你不使用,它永远不会分配数据索引,从而节省开销
- 4.0 对序列化进行了专门的优化,从流中加载大 JSON 和将 JSON 数据保存到流都会节省很多内存
- 4.0 通过支持缓存模式和只进模式,可以大幅节省内存占用和分配次数
- 总体来说,4.0 在保证性能的前提下,对内存使用情况更克制,算法也更复杂一些。
- 性能变化
- 对于遍历的场景,4.0 因为使用双向链接表,ForEach 或直接通过 FirstChild->LastChild 遍历都很方便,理论性能和 3.0 一致
- 对于随机只读场景,4.0 因为在首次随机访问时会缓存索引,纯随机读取场景要稍差一点,但也只限于首次访问,后续访问性能没有差距。
- 对于追加数据场景,4.0 因为增加链表元素分配一次内存,相比数组方式可能要调整数据大小,理论上要更快一些
- 对于解析场景,4.0 因为新的架构和解析算法,理论性能比 3.0 有了较大的提升
- 对于序列化场景,4.0 实现了新的工作流程,减少了内存的重复分配和释放,在性能上也有了很大的提升。与 3.0 相比,也提供了更多的序列化方式:
- 使用 TQSerializer 进行基于 RTTI 的序列化和反序列化(推荐,接口统一,更易拓展)
- 基于 TQJsonEncoder/TQJsonParser 来执行序列化或反序列化(内存占用更小
- 学习难度
- 4.0 统一了 JSON/XML/MessagePack 等格式序列化接口,提供了 TQSerializer 来统一格式的序列化和反序列化,方便用户将来能够快速的支持多种格式输出。
- 4.0 公开接口和 3.0 基本保持一致,迁移成本不高。但因为 4.0 从类转为记录类型,所以相对来说 ,还是要用户不可避免的在代码层级做一些变动,但学习难度几乎没有。
- 其它变化
- 4.0 完整支持注释类型(jdtLineComment / jdtBlockComment),而 3.0 无论解码还是编码,都会忽略注释
- 4.0 用户可以通过回调来控制解析流程,跳过不需要解析的结点,从而提升效率
- 4.0 编码设置增加了额外的选项来更灵活的控制输出 JSON 的方式,比如日期时间类型输出为 Unix 时间戳。
- 更多变动,请阅读源码了解。