Qt로 데이터를 직렬화하는 방법에대해서 소개한다.
JSON 유형은 데이터를 직렬화하기에 가장 잘 알려진 접근법일 것이다. Qt는 QJsonObject 와 QJsonDocument 클래스로 JSON 유형으로 작성 후 QByteArray로 직렬화 할 수 있는 방법을 제공한다.
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)가 있다.