Qt 序列化

序列化的目的是保存对象的状态,以便在需要时重新创建它。它允许您执行以下操作

  • 使用网络服务将对象发送到远程应用程序
  • 以 JSON 或 XML 字符串的形式传递对象
  • 保存和恢复用户信息或跨应用程序共享信息

Qt API 为几种用例提供了序列化支持:

  • Qt 中的JSON支持提供了一个易于使用的 C++ API,用于解析、修改和保存 JSON 数据。Qt 中的 CBOR 支持是一种紧凑的二进制数据编码形式,是 JSON 的超集。
  • QDataStream Qt 中的 CBOR 支持将二进制数据序列化为QIODevice
  • Qt XML C++ Classes为 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 当整个数据流已经确定且不会改变时,CBOR 是一个可行的选择。此外,数据的读取器和写入器都必须用 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 提供了 DOM 类和基于流的类来读写 XML 内容。

Qt 提供了表示 XML 文档的QDomDocument 类,以及通过简单的流 API 读写 XML 的两个类:QXmlStreamReaderQXmlStreamWriter

DOM XML 类

QDomDocument 类表示整个 XML 文档。它是文档树的根,提供对文档数据的主要访问。

基于流的 XML 类

流阅读器以标记流的形式报告 XML 文档。这与 SAX 不同,SAX 应用程序提供了处理程序来接收来自解析器的 XML 事件,而QXmlStreamReader 则驱动循环,在需要时从阅读器中提取标记。这种提取方法使得建立递归下降解析器成为可能,从而允许 XML 解析代码被分割成不同的方法或类。

QXmlStreamReader XML 1.0 解析器是用于格式良好的 XML 1.0 的解析器,不包括外部解析实体。因此,提供给数据流阅读器的数据必须符合 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 写入器

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.