Serialización en Qt
El propósito de la serialización es guardar el estado de un objeto para poder recrearlo cuando sea necesario. Permite realizar acciones como:
- Enviar el objeto a una aplicación remota mediante un servicio web
- Pasar el objeto como una cadena JSON o XML
- Guardar y restaurar la información del usuario o compartirla entre aplicaciones
La API de Qt proporciona soporte para la serialización para varios casos de uso:
- El soporteJSON en Qt proporciona una API C++ fácil de usar para analizar, modificar y guardar datos JSON. El soporte CBOR en Qt es una forma compacta de codificación de datos binarios que es un superconjunto de JSON.
- QDataStream proporciona serialización de datos binarios a un QIODevice
- Qt XML C++ Classes proporciona implementaciones C++ de los estándares XML Streaming y DOM para XML
- CBOR es la implementación de Qt para el formato de serialización CBOR.
- QSettings proporciona una forma de serializar y almacenar configuraciones de aplicaciones independientes de la plataforma.
Ventajas de JSON y CBOR
Cuando se utiliza JSON la información se almacena en un QJsonObject y un QJsonDocument se encarga de transmitir los valores a un QByteArray.
Por ejemplo
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 tiene varias ventajas:
- JSON textual es declarativo, lo que lo hace legible para los humanos
- La información está estructurada
- El intercambio de información genérica es fácil
- JSON permite ampliar los mensajes con valores adicionales
- Existen muchas soluciones para recibir y analizar JSON en soluciones basadas en la nube
CBOR es la Representación Concisa de Objetos Binarios, una forma muy compacta de codificación de datos binarios que es un superconjunto de JSON. Fue creada por el grupo de trabajo Constrained RESTful Environments (CoRE) del IETF, y se ha utilizado en muchas nuevas RFC. CBOR comparte muchas de las ventajas de JSON, pero sacrifica la legibilidad humana por la compacidad.
Ventajas de las clases QDataStream
QDataStream es una opción viable cuando todo el flujo de datos está determinado y no va a cambiar. Además, tanto el lector como el escritor de los datos deben estar escritos en Qt.
Añadir soporte para esto a una clase requiere dos operadores adicionales. Por ejemplo, para una clase llamada SensorInformation:
QDataStream &operator<<(QDataStream &, const SensorInformation &); QDataStream &operator>>(QDataStream &, SensorInformation &);
La implementación para la serialización se muestra a continuación:
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; }
La deserialización funciona de forma similar, pero utilizando el operador >>. Por ejemplo, out >> item.m_id, y así sucesivamente.
Usualmente, usar QDataStream es más rápido que usar JSON textual.
Ventajas de Qt XML Clases C
Qt proporciona tanto clases DOM como clases basadas en flujos para leer y escribir contenido XML.
Qt proporciona la clase QDomDocument que representa el documento XML y dos clases para leer y escribir el XML a través de una sencilla API de streaming: QXmlStreamReader y QXmlStreamWriter.
La clase DOM XML
QDomDocument representa el documento XML completo. Es la raíz del árbol del documento y proporciona el acceso principal a los datos del documento.
Las clases XML basadas en flujo
Un lector de flujo presenta un documento XML como un flujo de tokens. Esto difiere de SAX, ya que las aplicaciones SAX proporcionan manejadores para recibir eventos XML del analizador, mientras que QXmlStreamReader maneja el bucle, extrayendo tokens del lector cuando son necesarios. Este enfoque de extracción hace posible construir analizadores descendentes recursivos, lo que permite dividir el código de análisis XML en diferentes métodos o clases.
QXmlStreamReader un analizador sintáctico para XML 1.0 bien formado, excluyendo las entidades externas analizadas. Por lo tanto, los datos proporcionados al lector de secuencias se ajustan a los criterios del W3C para XML bien formado, o se producirá un error. Se pueden utilizar funciones como atEnd(), error() y hasError() para comprobar la existencia de tales errores y obtener una descripción de los mismos.
QXmlStreamWriter es una API de transmisión que se encarga de anteponer prefijos a los espacios de nombres, cuando se especifica el namespaceUri al escribir elementos o atributos.
Clases que proporcionan serialización
Contiene definiciones comunes tanto a las clases de streaming (QCborStreamReader y QCborStreamWriter) como a QCborValue | |
Se utiliza para contener una matriz de elementos CBOR | |
Se utiliza para contener un contenedor asociativo representable en CBOR | |
Decodificador CBOR simple, que opera sobre QByteArray o QIODevice | |
Codificador CBOR simple que opera sobre un flujo unidireccional | |
Encapsula un valor en CBOR | |
Serialización de datos binarios a un QIODevice | |
Encapsula un array JSON | |
Forma de leer y escribir documentos JSON | |
Encapsula un objeto JSON | |
Se utiliza para informar de errores durante el análisis sintáctico de JSON | |
Encapsula un valor en JSON | |
Interfaz práctica para leer y escribir texto | |
Rápido analizador sintáctico para leer documentos XML 1.0 bien formados a través de una sencilla API de streaming | |
Escritor XML 1.0 con una sencilla API de streaming |
© 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.