Qtのシリアライズ
シリアライズの目的は、オブジェクトの状態を保存して、必要なときに再作成できるようにすることです。これにより、次のようなアクションを実行できます:
- Web サービスを使用してリモートアプリケーションにオブジェクトを送信する。
- オブジェクトをJSONまたはXML文字列として渡す。
- ユーザー情報の保存と復元、アプリケーション間での共有
Qt API は、いくつかのユースケースに対してシリアライズのサポートを提供しています:
- Qt のJSONサポートは、JSON データを解析、変更、保存するための使いやすい C++ API を提供します。QtのCBORサポートは、JSONのスーパーセットであるバイナリデータエンコーディングのコンパクトな形式です。
- QDataStream バイナリデータのシリアライズを提供します。QIODevice
- Qt XML C++ Classes XMLのためのXML Streamingと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) WGによって作成され、多くの新しいRFCで使用されている。CBORはJSONの利点の多くを共有しているが、コンパクトさのために人間の読みやすさを犠牲にしている。
QDataStreamクラスの利点
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 コンテンツを読み書きするために、DOM クラスとストリームベースのクラスの両方を提供しています。
Qt は、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 はストリーミングAPIで、要素や属性を記述する際にnamespaceUriが指定されると、名前空間の接頭辞を処理します。
シリアライズを提供するクラス
ストリーミングクラス(QCborStreamReader、QCborStreamWriter)とQCborValueに共通する定義を含む。 | |
CBOR要素の配列を保持するために使用されます。 | |
CBORで表現可能な連想コンテナを保持するために使用される | |
QByteArrayまたはQIODeviceで動作する単純なCBORストリームデコーダ。 | |
一方向ストリームで動作する単純なCBORエンコーダ | |
CBORで値をカプセル化 | |
QIODeviceへのバイナリデータのシリアライズ | |
JSON配列をカプセル化 | |
JSONドキュメントを読み書きする方法 | |
JSONオブジェクトのカプセル化 | |
JSON解析中のエラー報告に使用される | |
JSON内の値をカプセル化する | |
テキストの読み書きに便利なインターフェース | |
シンプルなストリーミングAPIで整形式XMLを読み込む高速パーサー | |
シンプルなストリーミング API を備えた XML ライター |
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。