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을 사용할 경우 정보는 JSON 객체( QJsonObject )에 저장되며, JSON 객체 생성기( QJsonDocument )가 값을 JSON 객체( 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의 CoRE(Constrained RESTful Environments) 작업 그룹에서 개발되었으며, 많은 새로운 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는 XML 콘텐츠를 읽고 쓰기 위해 DOM 클래스와 스트림 기반 클래스를 모두 제공합니다.
Qt XML은 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 는 요소나 속성을 작성할 때 namespaceUri가 지정된 경우 네임스페이스 접두사 처리를 담당하는 스트리밍 API입니다.
직렬화를 제공하는 클래스
스트리밍 클래스(QCborStreamReader 및 QCborStreamWriter)와 QCborValue 모두에 공통적인 정의를 포함합니다. | |
CBOR 요소 배열을 담는 데 사용됩니다. | |
CBOR로 표현 가능한 연관 컨테이너를 담는 데 사용됩니다. | |
QByteArray 또는 QIODevice에서 작동하는 간단한 CBOR 스트림 디코더 | |
단방향 스트림에서 작동하는 간단한 CBOR 인코더 | |
CBOR 형식의 값을 캡슐화합니다 | |
바이너리 데이터를 QIODevice로 직렬화합니다 | |
JSON 배열을 캡슐화합니다 | |
JSON 문서를 읽고 쓰는 방법 | |
JSON 객체를 캡슐화합니다 | |
JSON 파싱 중 오류를 보고하는 데 사용됩니다 | |
JSON 내의 값을 캡슐화합니다 | |
텍스트를 읽고 쓰는 데 편리한 인터페이스 | |
간단한 스트리밍 API를 통해 구문 구조가 올바른 XML 1.0 문서를 빠르게 파싱하는 파서 | |
간단한 스트리밍 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.