한국어
Qt
 

Qt로 데이터를 직렬화하는 방법에대해서 소개한다.

 

JSON 유형은 데이터를 직렬화하기에 가장 잘 알려진 접근법일 것이다. Qt는 QJsonObject 와 QJsonDocument 클래스로 JSON 유형으로 작성 후 QByteArray로 직렬화 할 수 있는 방법을 제공한다.

 

JSON의 장점:

  • 데이터를 구조화 할 수 있고 사람이 읽을 수도 있다.
  • 일반 정보 교환이 쉽다.
  • 추가되는 정보에 대해서 메시지를 쉽게 확장 할 수 있다.
  • JSON을 수신하고 파싱하기위한 많은 솔루션이 존재한다.

다음 예제 코드는 센서정보가 QJsonObject 에 저장되고 QJsonDocument 는 값을 QByteArray로 직렬화한다.

#include <QJsonObject>
#include <QJsonDocument>

...

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은 가독성을 떨어 뜨릴 수 있지만 처리 속도를 높일 수 있는 장점이 있다. doc.toJson() 을 doc.toBinaryData() 로 간단히 전환하면 속도가 높아진다.

 

데이터 흐름(프로토콜)이 결정되어 변경되지 않을 경우 QDataStream 도 권장되는 옵션이다. 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;
}

QDataStream &operator>>(QDataStream &in, SensorInformation &item)
{
    QDataStream::FloatingPointPrecision prev = in.floatingPointPrecision();
    in.setFloatingPointPrecision(QDataStream::DoublePrecision);

    in >> 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;
    in.setFloatingPointPrecision(prev);
    return in;
}

 

QDataStream을 사용하면 텍스트 JSON보다 10 배 더 빠르며 또한 평균 메시지 크기도 대폭 줄어든다. 따라서 QDataStream은 확실히 괜찮은 옵션이다.

 

프로젝트에서 타사 오픈소스를 추가할 수 있는 경우 가장 좋은 직렬화 솔루션 중 하나는 Google의 Protocol Buffers(protobuf)가 있다.

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 85939
19 QThread 소개 및 예제 makersweb 2019.12.25 19486
18 Qt애플리케이션 객체(QCoreApplication, QGuiApplication, QApplication) 에 대해서 makersweb 2019.11.11 10110
17 QLabel의 텍스트 색과 배경색을 변경 makersweb 2020.02.25 6622
16 QPushButton 의 커스텀 이미지버튼 file makersweb 2019.11.05 6394
15 QQuickImageProvider 를 이용한 Qml 에서 이미지 표시 makersweb 2015.10.18 5999
14 컨테이너 클래스 - QVector makersweb 2020.03.17 2842
13 main함수 명령줄 옵션 해석 makersweb 2020.09.01 2232
» Qt로 데이터를 직렬화(serialization)하는 방법 makersweb 2020.08.04 2059
11 QRandomGenerator 클래스를 사용하여 난수(random values) 생성 makersweb 2020.10.17 1570
10 QThread 및 QMutex 예제 makersweb 2021.01.12 1351
9 재진입(Reentrancy) 및 스레드 안전성(Thread-Safety) makersweb 2020.04.19 1216
8 Qt 스마트 포인터 (QSharedPointer, QScopedPointer, QPointer) makersweb 2022.08.18 1139
7 QScopedPointer 소개 및 사용법 makersweb 2019.11.29 1027
6 QProcess 예제 (프로그램 재시작) file makersweb 2023.01.25 900
5 응용프로그램 자동실행 설정 (on Windows) makersweb 2021.05.08 564
4 QML의 사용자 정의 Image makersweb 2023.09.17 560
3 하드디스크 드라이브 여유 공간 계산 file makersweb 2023.01.15 512
2 Base64로 인코딩된 파일을 복원 makersweb 2023.08.06 451
1 HTTPS URL을 연결할 때 SslHandshakeFailedError 오류 makersweb 2022.07.31 358