Qt 직렬화
직렬화의 목적은 객체의 상태를 저장하여 필요할 때 다시 생성할 수 있도록 하는 것입니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다:
- 웹 서비스를 사용하여 객체를 원격 애플리케이션으로 보내기
- 개체를 JSON 또는 XML 문자열로 전달하기
- 사용자 정보 저장 및 복원 또는 애플리케이션 간 공유
Qt API는 여러 사용 사례에 대한 직렬화 지원을 제공합니다:
- Qt의JSON 지원은 JSON 데이터를 구문 분석, 수정 및 저장하는 데 사용하기 쉬운 C++ API를 제공합니다. Qt의 CBOR 지원은 JSON의 상위 집합인 압축된 형태의 바이너리 데이터 인코딩입니다.
- QDataStream 바이너리 데이터의 직렬화를 제공합니다. QIODevice
- Qt XML C++ Classes XML 스트리밍 및 XML용 DOM 표준의 C++ 구현을 제공합니다.
- CBOR은 CBOR 직렬화 형식에 대한 Qt의 구현입니다.
- 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의 상위 집합인 매우 간결한 형태의 바이너리 데이터 인코딩입니다. 이는 많은 새로운 RFC에서 사용되어 온 IETF CoRE(Constrained RESTful Environments) WG에서 만들었습니다. 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는 XML 콘텐츠를 읽고 쓸 수 있는 DOM 클래스와 스트림 기반 클래스를 모두 제공합니다.
Qt는 XML 문서를 나타내는 QDomDocument 클래스와 간단한 스트리밍 API를 통해 XML을 읽고 쓰기 위한 두 개의 클래스 QXmlStreamReader 과 QXmlStreamWriter 를 제공합니다.
DOM XML 클래스
QDomDocument 클래스는 전체 XML 문서를 나타냅니다. 이 클래스는 문서 트리의 루트이며 문서 데이터에 대한 기본 액세스를 제공합니다.
스트림 기반 XML 클래스
스트림 리더는 XML 문서를 토큰 스트림으로 보고합니다. SAX 애플리케이션은 파서에서 XML 이벤트를 수신하는 핸들러를 제공하는 반면, QXmlStreamReader 는 루프를 구동하여 필요할 때 리더에서 토큰을 가져온다는 점에서 SAX와 다릅니다. 이러한 풀링 접근 방식을 사용하면 재귀적 하강 파서를 구축할 수 있으므로 XML 파싱 코드를 여러 메서드나 클래스로 분할할 수 있습니다.
QXmlStreamReader 외부 구문 분석된 엔티티를 제외한 잘 형식화된 XML 1.0용 구문 분석기입니다. 따라서 스트림 리더에 제공되는 데이터가 W3C의 올바른 형식의 XML에 대한 기준을 준수하는지, 그렇지 않으면 오류가 발생합니다. atEnd()
, error()
, hasError()
와 같은 함수를 사용하여 이러한 오류를 테스트하고 오류에 대한 설명을 얻을 수 있습니다.
QXmlStreamWriter 는 엘리먼트나 어트리뷰트를 작성할 때 네임스페이스Uri를 지정하면 네임스페이스 접두사 처리를 처리하는 스트리밍 API입니다.
직렬화를 제공하는 클래스
스트리밍 클래스(QCborStreamReader 및 QCborStreamWriter)와 QCborValue에 공통으로 적용되는 정의가 포함되어 있습니다. | |
CBOR 요소 배열을 보유하는 데 사용됩니다. | |
CBOR로 표현 가능한 연관 컨테이너를 보유하는 데 사용됩니다. | |
QByteArray 또는 QIODevice에서 작동하는 간단한 CBOR 스트림 디코더 | |
단방향 스트림에서 작동하는 간단한 CBOR 인코더 | |
값을 CBOR로 캡슐화 | |
바이너리 데이터를 QIODevice로 직렬화합니다. | |
JSON 배열 캡슐화 | |
JSON 문서를 읽고 쓰는 방법 | |
JSON 객체 캡슐화 | |
JSON 구문 분석 중 오류 보고에 사용 | |
값을 JSON으로 캡슐화 | |
텍스트 읽기 및 쓰기를 위한 편리한 인터페이스 | |
간단한 스트리밍 API를 통해 잘 형식화된 XML을 읽기 위한 빠른 파서 | |
간단한 스트리밍 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.