The purpose of serialization is to save the state of an object to be able to recreate it when needed. It allows you to perform actions like:
The Qt API provides support for serialization for several use cases:
當使用 JSON information is stored in a QJsonObject 和 QJsonDocument takes care to stream values into a 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 has several advantages:
CBOR is the Concise Binary Object Representation, a very compact form of binary data encoding that is a superset of JSON. It was created by the IETF Constrained RESTful Environments (CoRE) WG, which has been used in many new RFCs. CBOR shares many of the advantages of JSON, but sacrifices human readability for compactness.
QDataStream is a viable option when the whole flow of data is determined and not about to change. In addition, both the reader and the writer of the data must be written in Qt.
Adding support for this to a class requires two additional operators. For example, for a class named SensorInformation:
QDataStream &operator<<(QDataStream &, const SensorInformation &); QDataStream &operator>>(QDataStream &, SensorInformation &);
The implementation for the serialization is shown below:
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; }
Deserialization works similarly, but using the
>>
operator. For example,
out >> item.m_id
, and so on.
Usually, using QDataStream is faster than using textual JSON.
Qt provides both DOM classes and stream-based classes to read and write XML content.
Qt 提供 QDomDocument class that represents the XML document and two classes for reading and writing the XML through a simple streaming API: QXmlStreamReader and QXmlStreamWriter .
QDomDocument class represents the entire XML document. It is the root of the document tree and provides primary access to the document's data.
A stream reader reports an XML document as a stream of tokens. This differs from SAX as SAX applications provide handlers to receive XML events from the parser, whereas the QXmlStreamReader drives the loop, pulling tokens from the reader when they are needed. This pulling approach makes it possible to build recursive descent parsers, allowing XML parsing code to be split into different methods or classes.
QXmlStreamReader
a parser for well-formed XML 1.0, excluding external parsed entities. Hence, data provided to the stream reader adheres to the W3C's criteria for well-formed XML, or an error will be raised. Functions such as
atEnd()
,
error()
,和
hasError()
can be used to test for such errors and obtain a description of them.
The QXmlStreamWriter is a streaming API that takes care of prefixing namespaces, when the namespaceUri is specified when writing elements or attributes.
| Contains definitions common to both the streaming classes (QCborStreamReader and QCborStreamWriter) and to QCborValue | |
| 用於保持 CBOR (簡明二進製對象錶示) 元素的數組 | |
| 用於保持以 CBOR 錶示的關聯容器 | |
| 操作 QByteArray 或 QIODevice 的簡單 CBOR 流解碼器 | |
| 操作單嚮流的簡單 CBOR 編碼器 | |
| 封裝值在 CBOR 中 | |
| 把二進製數據序列化到 QIODevice | |
| 封裝 JSON 數組 | |
| 讀寫 JSON 文檔的辦法 | |
| 封裝 JSON 對象 | |
| 用於在 JSON 剖析期間報告錯誤 | |
| 把值封裝在 JSON 中 | |
| 用於讀寫文本的方便接口 | |
| 憑藉簡單流式 API 讀取格式良好的 XML 1.0 文檔的快速剖析器 | |
| 帶有簡單流式 API 的 XML 1.0 寫入器 |