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的类:QXmlStreamReaderQXmlStreamWriter

DOM XML类

QDomDocument类表示整个XML文档。它是文档树的根本,并提供对文档数据的初步访问。

基于流的XML类

流式读取器将XML文档报告为一个令牌流。这与SAX不同,因为SAX应用程序提供处理程序来接收解析器从解析器发送的XML事件,而QXmlStreamReader驱动循环,在需要时从读取器中拉取令牌。这种拉取方法使得能够构建递归下降解析器,允许将XML解析代码拆分为不同的方法或类。

QXmlStreamReader是一个用于格式良好的XML 1.0的解析器,不包括外部Parsed实体。因此,提供给流式读取器的数据符合W3C对格式良好的XML的标准,否则将引发错误。可以使用如atEnd()error()hasError()之类的函数来检查这样的错误并获取它们的描述。

QXmlStreamWriter是一个流式API,当在写入元素或属性时指定namespaceUri时,会处理命名空间前缀。

提供序列化的类

<QtCborCommon>

包含流式类(QCborStreamReader和QCborStreamWriter)和QCborValue共用的定义

QCborArray

用于存储CBOR元素的数组

QCborMap

用于存储可表示为CBOR的关联容器

QCborStreamReader

简单的CBOR流解码器,在QByteArray或QIODevice上操作

QCborStreamWriter

在单向流上操作的简单CBOR编码器

QCborValue

封装CBOR中的值

QDataStream

将二进制数据序列化到QIODevice

QJsonArray

封装JSON数组

QJsonDocument

阅读和写入JSON文档的方法

QJsonObject

封装JSON对象

QJsonParseError

在JSON解析过程中报告错误时使用

QJsonValue

封装JSON中的值

QTextStream

読書や書き込みの簡便なインタフェース

QXmlStreamReader

通过简单的流式API读取格式良好的XML的快速解析器

QXmlStreamWriter

具有简单流式API的XML编写器

© 2024 Qt社有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款发布的。Qt及其标志是芬兰及其它国家的The Qt Company Ltd.的商标。所有其他商标均属其各自所有者的财产。