[教程]QJSON 4.0 与 3.0 功能特性对比

admin4个月前未分类519

QJSON 4.0 目录已经处于基本可用状态,可以供大家在新的开发项目中试用,就目前版本来说,4.0 相比 3.0 版有以下大不同:

  1. 架构变化

    • 3.0 版 TQJson 是一个类 (class),4.0 版是一个记录类型 (record) 并且改名为 TQJsonNode 以避免和 3.0 版本冲突

    • 4.0 版实现了 IQSerializeReader 和 IQSerializeWriter 接口,可以统一多种格式的序列化和反序列化

    • 4.0 版将支持 Free Pascal 3.3.1 + 版本,3.0 版本不支持

  2. 内存管理

    • 4.0 支持字符串缓存模式,重复的字符串内容,只会保存一个版本

    • 4.0 使用双向链表而不是数组来存储同级的兄弟结点,分配内存次数相比数组模式更少

    • 4.0 支持按数组方式访问,但如果你不使用,它永远不会分配数据索引,从而节省开销

    • 4.0 对序列化进行了专门的优化,从流中加载大 JSON 和将 JSON 数据保存到流都会节省很多内存

    • 4.0 通过支持缓存模式和只进模式,可以大幅节省内存占用和分配次数

    • 总体来说,4.0 在保证性能的前提下,对内存使用情况更克制,算法也更复杂一些。

  3. 性能变化

    • 使用 TQSerializer 进行基于 RTTI 的序列化和反序列化(推荐,接口统一,更易拓展)

    • 基于 TQJsonEncoder/TQJsonParser 来执行序列化或反序列化(内存占用更小

    • 对于遍历的场景,4.0 因为使用双向链接表,ForEach 或直接通过 FirstChild->LastChild 遍历都很方便,理论性能和 3.0 一致

    • 对于随机只读场景,4.0 因为在首次随机访问时会缓存索引,纯随机读取场景要稍差一点,但也只限于首次访问,后续访问性能没有差距。

    • 对于追加数据场景,4.0 因为增加链表元素分配一次内存,相比数组方式可能要调整数据大小,理论上要更快一些

    • 对于解析场景,4.0 因为新的架构和解析算法,理论性能比 3.0 有了较大的提升

    • 对于序列化场景,4.0 实现了新的工作流程,减少了内存的重复分配和释放,在性能上也有了很大的提升。与 3.0 相比,也提供了更多的序列化方式:

  4. 学习难度

    • 4.0 统一了 JSON/XML/MessagePack 等格式序列化接口,提供了 TQSerializer 来统一格式的序列化和反序列化,方便用户将来能够快速的支持多种格式输出。

    • 4.0 公开接口和 3.0 基本保持一致,迁移成本不高。但因为 4.0 从类转为记录类型,所以相对来说 ,还是要用户不可避免的在代码层级做一些变动,但学习难度几乎没有。

  5. 其它变化

    • 4.0 完整支持注释类型(jdtLineComment / jdtBlockComment),而 3.0 无论解码还是编码,都会忽略注释

    • 4.0 用户可以通过回调来控制解析流程,跳过不需要解析的结点,从而提升效率

    • 4.0 编码设置增加了额外的选项来更灵活的控制输出 JSON 的方式,比如日期时间类型输出为 Unix 时间戳。

    • 更多变动,请阅读源码了解。


标签: delphi

相关文章

一个共享的计时器类封装

QDAC 4.0 中已经包含了此单元,名称改为qdac.timer.share,使用 TQShareTimer 来做相关处理。这个是一个精度为秒的共享定时器实现,可以秒为单位创建多个共享的定时器,这些...

高效处理在主线程中显示后台线程处理进度

先看经典的处理方法:TThread.CreateAnonymousThread(     procedure     ...

Delphi 函数的内部函数在匿名回调函数中无法使用的一种解决办法

这个问题很简单,将对应的函数改写赋值到一个匿名函数变量即可。function test;   function add(x,y:Integer):Intege...

运行时动态修改 FMX 样式

运行时动态修改 FMX 样式

简单说几个点:1、FMX 框架下,样式是通过名称来标志的。2、GetStyleObject 默认是克隆原始的样式,所以直接修改对象自身的 FResourceLink 实例,不会影响其它样式,如果要修改...

Delphi 泛型中数据内容比较

第一:你需要引入 System.Generics.Defaults 单元,系统默认实现的比较方法,都在该单元定义。第二:你要明确下你的需求,是只比较相等就可以,还是要比较大小。IEqualityCom...