한국어
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 86202
79 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 4941
78 QSocketNotifier로 파일 디스크립터의 활동감지 makersweb 2019.08.28 1736
77 MCU용 Qt에 대해서 makersweb 2019.08.22 1923
76 [Qt News] Qt for Python을 위한 기술 비전 j2doll 2019.08.20 1627
75 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 3908
74 [Qt News] Qt 6 기술 비전 (Technical vision for Qt 6) [2] j2doll 2019.08.08 2123
73 [Qt News] Qt6 Git 개발 초기 단계 시작하기 j2doll 2019.08.02 2337
72 [Qt] Google Play의 향후 요구 사항을 준수하는 방법 [2] j2doll 2019.07.29 978
71 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 4024
70 QML, 이미지, 폰트등을 바이너리 리소스로 만들기 makersweb 2019.06.24 3525
69 Qt Creator에서 임베디드 장치로 deploy설정(Custom Process Step) file makersweb 2019.06.15 2208
68 Qt Quick Controls 2사용 및 스타일 설정 file makersweb 2019.06.07 6283
67 QML 강좌 - 동적 Listing (ListView) file makersweb 2019.06.01 10125
66 QtInstallerFramework로 온라인 설치프로그램(Online Installer)만드는 방법 [4] file makersweb 2019.05.28 6277
65 QtCreator Design으로 GUI만들기 (QML로 만드는 Hello World -2) [1] file makersweb 2019.05.26 14985
64 QML에서 멀티 스레드(multithreading) 프로그래밍 file makersweb 2019.05.25 2673
63 QtSerialPort를 사용한 시리얼(Serial)통신 [3] makersweb 2019.05.21 11982
62 Qt기반의 오픈소스 프로젝트들 makersweb 2019.05.15 5463
61 Q_D매크로와 d-pointer file makersweb 2019.05.07 763
60 가상키보드(Qt Virtual Keyboard)를 사용하는 방법 [32] file makersweb 2019.05.03 221929