Qt 序列化
序列化的目的是将对象的状态保存下来,以便在需要时重新创建它。它允许你执行以下操作:
- 通过 Web 服务将对象发送到远程应用程序
- 将对象作为 JSON 或 XML 字符串传递
- 保存和恢复用户信息或跨应用程序共享信息
Qt API 为多个用例提供对序列化的支持
- JSON 支持在 Qt 中提供了一个易于使用的 C++ API 来解析、修改和保存 JSON 数据。 Qt 中的 CBOR 支持 是一种二进制数据编码的紧凑形式,它是 JSON 的超集。
- QDataStream 提供将二进制数据序列化到 QIODevice 的功能
- Qt XML C++ 类 提供对 XML 的 XML 流 和 DOM 标准的 C++ 实现支持
- CBOR 是 Qt 的 CBOR 序列化格式的实现。
- QSettings 提供了一种序列化和存储平台无关的应用程序设置的方法。
JSON 和 CBOR 的优势
当你使用 JSON 时,信息被存储在 QJsonObject 中,QJsonDocument 会负责将值流式传输到 QByteArray。
例如
QJsonObject jobject; jobject["SensorID"] = m_id; jobject["AmbientTemperature"] = m_ambientTemperature; jobject["ObjectTemperature"] = m_objectTemperature; jobject["AccelerometerX"] = m_accelerometerX; jobject["AccelerometerY"] = m_accelerometerY; jobject["AccelerometerZ"] = m_accelerometerZ; jobject["Altitude"] = m_altitude; jobject["Light"] = m_light; jobject["Humidity"] = m_humidity; QJsonDocument doc( jobject ); return doc.toJson();
JSON 有几个优势
- 文本 JSON 是声明性的,这使得它对人类可读
- 信息是结构化的
- 交换通用信息很容易
- JSON 允许通过附加值扩展消息
- 许多基于云的解决方案都存在用于接收和解析 JSON 的解决方案
CBOR(简要二进制对象表示)是一种非常紧凑的二进制数据编码形式,它是 JSON 的超集。它由 IETF 约束 RESTful 环境 (CoRE) 工作组创建,已用于许多新的 RFC。CBOR 与 JSON 具有很多相同的优势,但牺牲了可读性以换取紧凑性。
QDataStream 类的优势
QDataStream 当整个数据流已确定且不会改变时,是一个可行的选项。此外,数据的读取器和写入器都必须是 Qt 编写的。
向一个类添加对这种支持时需要两个额外的操作符。例如,对于一个名为 SensorInformation 的类
QDataStream &operator<<(QDataStream &, const SensorInformation &); QDataStream &operator>>(QDataStream &, SensorInformation &);
序列化的实现如下所示
QDataStream &operator<<(QDataStream &out, const SensorInformation &item) { QDataStream::FloatingPointPrecision prev = out.floatingPointPrecision(); out.setFloatingPointPrecision(QDataStream::DoublePrecision); out << item.m_id << item.m_ambientTemperature << item.m_objectTemperature << item.m_accelerometerX << item.m_accelerometerY << item.m_accelerometerZ << item.m_altitude << item.m_light << item.m_humidity; out.setFloatingPointPrecision(prev); return out; }
反序列化工作方式类似,但使用 >>
操作符。例如,out >> item.m_id
,等等。
通常,使用 QDataStream 比使用文本 JSON 更快。
Qt XML C++ 类的优势
Qt 提供了用于读取和写入 XML 内容的 DOM 类和基于流的类。
Qt提供了表示XML文档的QDomDocument类,以及两个用于通过简单的流式API读取和写入XML的类:QXmlStreamReader和QXmlStreamWriter。
DOM XML类
QDomDocument类表示整个XML文档。它是文档树的根本,并提供对文档数据的初步访问。
基于流的XML类
流式读取器将XML文档报告为一个令牌流。这与SAX不同,因为SAX应用程序提供处理程序来接收解析器从解析器发送的XML事件,而QXmlStreamReader驱动循环,在需要时从读取器中拉取令牌。这种拉取方法使得能够构建递归下降解析器,允许将XML解析代码拆分为不同的方法或类。
QXmlStreamReader是一个用于格式良好的XML 1.0的解析器,不包括外部Parsed实体。因此,提供给流式读取器的数据符合W3C对格式良好的XML的标准,否则将引发错误。可以使用如atEnd()
、error()
和hasError()
之类的函数来检查这样的错误并获取它们的描述。
QXmlStreamWriter是一个流式API,当在写入元素或属性时指定namespaceUri时,会处理命名空间前缀。
提供序列化的类
包含流式类(QCborStreamReader和QCborStreamWriter)和QCborValue共用的定义 | |
用于存储CBOR元素的数组 | |
用于存储可表示为CBOR的关联容器 | |
简单的CBOR流解码器,在QByteArray或QIODevice上操作 | |
在单向流上操作的简单CBOR编码器 | |
封装CBOR中的值 | |
将二进制数据序列化到QIODevice | |
封装JSON数组 | |
阅读和写入JSON文档的方法 | |
封装JSON对象 | |
在JSON解析过程中报告错误时使用 | |
封装JSON中的值 | |
読書や書き込みの簡便なインタフェース | |
通过简单的流式API读取格式良好的XML的快速解析器 | |
具有简单流式API的XML编写器 |
© 2024 Qt社有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3
的条款发布的。Qt及其标志是芬兰及其它国家的The Qt Company Ltd.的商标。所有其他商标均属其各自所有者的财产。