本页内容

Qt 序列化

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

  • 使用 Web 服务将对象发送至远程应用程序
  • 将对象作为 JSON 或 XML 字符串传递
  • 保存和恢复用户信息,或在应用程序之间共享这些信息

Qt API 为多种使用场景提供了序列化支持:

  • Qt 中的JSON支持提供了一个易于使用的 C++ API,用于解析、修改和保存 JSON 数据。Qt 中的 CBOR 支持是一种紧凑的二进制数据编码形式,它是 JSON 的超集。
  • QDataStream 支持将二进制数据序列化为QIODevice
  • Qt XML C++ Classes 提供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即“简洁二进制对象表示法”(Concise Binary Object Representation),是一种非常紧凑的二进制数据编码形式,是 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 同时提供了 DOM 类和基于流的类来读取和写入 XML 内容。

Qt 提供了代表 XML 文档的QDomDocument 类,以及两个用于通过简单的流式 API 读写 XML 的类:QXmlStreamReader 和QXmlStreamWriter 。

DOM XML 类

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

基于流的 XML 类

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

QXmlStreamReader 一个用于解析结构良好的 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 1.0 文档的解析器

QXmlStreamWriter

带简单流式 API 的 XML 1.0 写入器

© 2026 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.