Qtのシリアライズ
シリアライゼーションの目的は、オブジェクトの状態を保存し、必要に応じてそれを再現できるようにすることです。これにより、次のような操作が可能になります:
- Webサービスを利用して、オブジェクトをリモートアプリケーションに送信する
- オブジェクトを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(Concise Binary Object Representation)は、JSONのスーパーセットである、非常にコンパクトなバイナリデータエンコーディング形式です。これはIETFのConstrained RESTful Environments(CoRE)ワーキンググループによって作成され、多くの新しいRFCで使用されています。 CBORはJSONの利点の多くを共有していますが、コンパクトさを優先するために人間による可読性を犠牲にしています。
QDataStreamクラスの利点
QDataStream データの流れ全体が確定しており、変更される見込みがない場合には、有効な選択肢となります。さらに、データの読み取り側と書き込み側の両方をQtで記述する必要があります。
クラスにこの機能を追加するには、2つの演算子を追加する必要があります。たとえば、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 には、XML コンテンツの読み取りおよび書き込みを行うための DOM クラスとストリームベースのクラスの両方が用意されています。
Qt XML は、XML ドキュメントを表す `QDomDocument ` クラスと、シンプルなストリーミング API を通じて XML を読み書きするための 2 つのクラス、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.