API:Data.DBXJSONReflect.TJSONMarshal
Delphi
TJSONMarshal = class(TTypeMarshaller<TJSONValue>)
C++
class PASCALIMPLEMENTATION TJSONMarshal : public TTypeMarshaller__1<System::Json::TJSONValue*>
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
class | public | Data.DBXJSONReflect.pas Data.DBXJSONReflect.hpp |
Data.DBXJSONReflect | Data.DBXJSONReflect |
説明
マーシャリングの親クラスを表します。
Data.DBXJSONReflect.TJSONMarshal は Data.DBXJSONReflect.TTypeMarshaller を継承しています。以下の内容はすべて Data.DBXJSONReflect.TTypeMarshaller を参照しています。
マーシャリングの親クラスを表します。
DBXJSONReflect ユニットは、JSON オブジェクトを具体的な対象とするオブジェクト シリアル化の軽量フレームワークを表します。 これを使用すると、ユーザーはあらゆるユーザー オブジェクトをシリアル化可能なオブジェクト(JSON や XML など)に変換でき、またその逆の変換もできます。
シリアル化可能なオブジェクトへの変換をマーシャリングと呼びます。 TJSONMarshal クラスはユーザー オブジェクトを TJSONValue オブジェクトに変換します。 その逆の処理はアンマーシャリングと呼ばれます。 TJSONUnMarshal は TJSONValue を元のユーザー オブジェクトに戻します。
TTypeMarshaller クラスは Visitor パターンを実装しており、マーシャリングはこのパターンに基づいて行われます。 あらかじめ決められた状況で、イベントが発生します。 マーシャリング時に起こり得る状況の一覧を以下の表に示します。
状況 | イベント |
---|---|
新しいオブジェクトが見つかる。 |
|
既にアクセスしたオブジェクトが見つかる。 |
|
新しいオブジェクトの内容が再度アクセスされる。 |
|
新しいフィールドが見つかる。 |
|
新しいフィールドがアクセスされる。 |
|
文字列値が見つかる。 |
|
数値が見つかる。 |
|
nil 値が見つかる。 |
|
論理値が見つかる。 |
|
リスト値が見つかる。 |
|
リストの処理が終了する。 |
これらのイベントは TConverter インスタンスで受信されます。 ユーザー オブジェクトの構造によっては、これらは重複して発生します。 イベントとそれらの引数に基づいて、TConverter インスタンスがユーザー オブジェクトと同等のイメージを作成します。 TJSONConverter で JSON 変換コンポーネントが実装されます。
変換コンポーネントで作成されたオブジェクト イメージは、永続化やリモーティングなどに使用することができます。 このイメージは、アンマーシャリングで作動する逆変換コンポーネント イベントを使って、元のユーザー オブジェクトを復元するのに使用できます。 TJSONUnMarshal では、JSON イメージを使用してユーザー オブジェクトを復元します。 アンマーシャリングの方が簡単な処理であり、RTTI を使用してユーザー オブジェクトを復元します。 ユーザー オブジェクトが引数のないコンストラクタを持っていることを前提としています。
マーシャリング処理では、すべてのフィールドを文字列、数値、論理値のいずれかに変換します。 より複雑なフィールドを変換するには、ユーザー定義の変換コンポーネントや逆変換コンポーネントが必要です。 処理を行う前に、ユーザー定義の変換コンポーネントおよび逆変換コンポーネントをマーシャリング インスタンスおよびアンマーシャリング インスタンスに登録することができます。
変換コンポーネントと逆変換コンポーネントを型とフィールドに対して、あるいは型に対して登録することができます。 そのような型の宣言済みフィールドはすべて、ユーザーから提供された変換コンポーネントや逆変換コンポーネントで処理されます。 フィールドに登録された変換コンポーネントや逆変換コンポーネントは、型の変換コンポーネントや逆変換コンポーネントより優先されます。
フィールド変換コンポーネントは、フィールド値を文字列、オブジェクト、文字列リスト、オブジェクト リストのいずれかに変換できます。 これらの変換値は対応する逆変換コンポーネントに引数として渡され、そこでフィールド値が復元されることになります。
型変換コンポーネントは、値を文字列、オブジェクト、文字列リスト、オブジェクト リストのいずれかに変換できます。 これらは型の逆変換コンポーネントに引数として渡され、そこで元の型インスタンスが復元されることになります。
たとえば、TStringList フィールドを変換コンポーネントで文字列配列に変換し、逆変換コンポーネントでその文字列リストを使用して TStringList のインスタンスを作成し値を設定することができます。 この程度の複雑さが、ユーザー定義の変換コンポーネントや逆変換コンポーネントで想定されます。
RTTI がより強力になり、ライブラリ コードに格納されるメタデータが増えるにつれて、ユーザー定義の変換コンポーネントの必要性は低くなります。
整数型、文字列型、文字型、列挙型、浮動小数点型、オブジェクト型、レコード型の各フィールドについては、組み込みの変換や逆変換が既に存在します。 セット、メソッド、バリアント、インターフェイス、ポインタ、動的配列、クラス参照、配列の各型については、フィールド値は無視され、ユーザー定義の変換が必要です。
TTypeMarshaller では、オブジェクト ID マーカーと変換コンポーネント登録をサポートしています。 このクラスを特化する場合は通常、シリアル化型が提供されます。