Qt-Serialisierung

Der Zweck der Serialisierung besteht darin, den Zustand eines Objekts zu speichern, um es bei Bedarf wiederherstellen zu können. Es ermöglicht Ihnen Aktionen wie:

  • Senden des Objekts an eine entfernte Anwendung mit Hilfe eines Webdienstes
  • Übergabe des Objekts als JSON- oder XML-String
  • Speichern und Wiederherstellen von Benutzerinformationen oder deren gemeinsame Nutzung in verschiedenen Anwendungen

Die Qt-API bietet Unterstützung für Serialisierung für verschiedene Anwendungsfälle:

  • DieJSON-Unterstützung in Qt bietet eine einfach zu verwendende C++-API zum Parsen, Ändern und Speichern von JSON-Daten. CBOR-Unterstützung in Qt ist eine kompakte Form der Binärdatenkodierung, die eine Obermenge von JSON ist.
  • QDataStream bietet die Serialisierung von Binärdaten in eine QIODevice
  • Qt XML C++ Classes bietet C++-Implementierungen der XML-Streaming- und DOM-Standards für XML
  • CBOR ist die Qt-Implementierung für das Serialisierungsformat CBOR.
  • QSettings bietet eine Möglichkeit zur Serialisierung und Speicherung von plattformunabhängigen Anwendungseinstellungen.

Vorteile von JSON und CBOR

Bei der Verwendung von JSON werden die Informationen in einem QJsonObject gespeichert und ein QJsonDocument sorgt für das Streaming von Werten in ein QByteArray.

Zum Beispiel

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 hat mehrere Vorteile:

  • Textuelles JSON ist deklarativ, was es für Menschen lesbar macht.
  • Die Informationen sind strukturiert
  • Der Austausch von generischen Informationen ist einfach
  • JSON ermöglicht die Erweiterung von Nachrichten mit zusätzlichen Werten
  • Es gibt viele Lösungen für den Empfang und das Parsen von JSON in Cloud-basierten Lösungen

CBOR ist die Concise Binary Object Representation, eine sehr kompakte Form der binären Datenkodierung, die eine Obermenge von JSON ist. Es wurde von der IETF Constrained RESTful Environments (CoRE) WG entwickelt, die in vielen neuen RFCs verwendet wurde. CBOR teilt viele der Vorteile von JSON, opfert aber die Lesbarkeit zugunsten der Kompaktheit.

Vorteile der QDataStream-Klassen

QDataStream ist eine praktikable Option, wenn der gesamte Datenfluss festgelegt ist und sich nicht ändern wird. Darüber hinaus müssen sowohl der Leser als auch der Schreiber der Daten in Qt geschrieben werden.

Das Hinzufügen dieser Unterstützung zu einer Klasse erfordert zwei zusätzliche Operatoren. Zum Beispiel für eine Klasse namens SensorInformation:

QDataStream &operator<<(QDataStream &, const SensorInformation &);
QDataStream &operator>>(QDataStream &, SensorInformation &);

Die Implementierung für die Serialisierung ist unten dargestellt:

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;
}

Die Deserialisierung funktioniert ähnlich, allerdings unter Verwendung des >> -Operators. Zum Beispiel out >> item.m_id, und so weiter.

Normalerweise ist die Verwendung von QDataStream schneller als die Verwendung von textuellem JSON.

Vorteile von Qt XML C++-Klassen

Qt bietet sowohl DOM-Klassen als auch Stream-basierte Klassen zum Lesen und Schreiben von XML-Inhalten.

Qt bietet die Klasse QDomDocument, die das XML-Dokument darstellt, und zwei Klassen zum Lesen und Schreiben von XML über eine einfache Streaming-API: QXmlStreamReader und QXmlStreamWriter.

Die DOM XML Classes

QDomDocument Klasse repräsentiert das gesamte XML-Dokument. Sie ist die Wurzel des Dokumentenbaums und bietet primären Zugriff auf die Daten des Dokuments.

Die streambasierten XML-Klassen

Ein Stream-Reader meldet ein XML-Dokument als einen Strom von Token. Dies unterscheidet sich von SAX, da SAX-Anwendungen Handler bereitstellen, um XML-Ereignisse vom Parser zu empfangen, während QXmlStreamReader die Schleife antreibt und Token vom Reader abruft, wenn sie benötigt werden. Dieser Pulling-Ansatz ermöglicht den Aufbau rekursiver Descent-Parser, so dass der XML-Parsing-Code in verschiedene Methoden oder Klassen aufgeteilt werden kann.

QXmlStreamReader ein Parser für wohlgeformtes XML 1.0, der externe geparste Entitäten ausschließt. Daher müssen die Daten, die dem Stream-Reader zur Verfügung gestellt werden, den Kriterien des W3C für wohlgeformtes XML entsprechen, andernfalls wird ein Fehler ausgegeben. Funktionen wie atEnd(), error() und hasError() können verwendet werden, um auf solche Fehler zu testen und eine Beschreibung zu erhalten.

Die QXmlStreamWriter ist eine Streaming-API, die sich um die Präfixierung von Namespaces kümmert, wenn die NamespaceUri beim Schreiben von Elementen oder Attributen angegeben wird.

Klassen, die Serialisierung bereitstellen

<QtCborCommon>

Enthält Definitionen, die sowohl für die Streaming-Klassen (QCborStreamReader und QCborStreamWriter) als auch für QCborValue gelten

QCborArray

Wird verwendet, um ein Array von CBOR-Elementen zu speichern

QCborMap

Zur Aufnahme eines assoziativen Containers, der in CBOR dargestellt werden kann

QCborStreamReader

Einfacher CBOR Stream Decoder, der entweder mit einem QByteArray oder QIODevice arbeitet

QCborStreamWriter

Einfacher CBOR-Encoder, der mit einem Einweg-Stream arbeitet

QCborValue

Verkapselung eines Wertes in CBOR

QDataStream

Serialisierung von Binärdaten an ein QIODevice

QJsonArray

Verkapselt ein JSON-Array

QJsonDocument

Möglichkeit zum Lesen und Schreiben von JSON-Dokumenten

QJsonObject

Verkapselt ein JSON-Objekt

QJsonParseError

Wird verwendet, um Fehler beim JSON-Parsing zu melden

QJsonValue

Verkapselt einen Wert in JSON

QTextStream

Bequeme Schnittstelle zum Lesen und Schreiben von Text

QXmlStreamReader

Schneller Parser zum Lesen von wohlgeformtem XML über eine einfache Streaming-API

QXmlStreamWriter

XML-Writer mit einer einfachen Streaming-API

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