Data.DBXJSONReflect.TTypeMarshaller

Aus RAD Studio API Documentation
Wechseln zu: Navigation, Suche

Data.DBXJSONReflect.TMarshalUnmarshalBaseSystem.TObjectTTypeMarshaller

Delphi

TTypeMarshaller<TSerial: class> = class(TMarshalUnmarshalBase)

C++

template<typename TSerial> class PASCALIMPLEMENTATION TTypeMarshaller__1 : public TMarshalUnmarshalBase

Eigenschaften

Typ Sichtbarkeit Quelle Unit Übergeordnet
class public
Data.DBXJSONReflect.pas
Data.DBXJSONReflect.hpp
Data.DBXJSONReflect Data.DBXJSONReflect

Beschreibung

Repräsentiert die übergeordnete Marshalling-Klasse.

Die Unit DBXJSONReflect repräsentiert ein schlankes Framework für die Objektserialisierung mit dem Fokus auf JSON-Objekte. Es ermöglicht die Umwandlung jedes Benutzerobjekts in ein serialisierbares Objekt (wie JSON, XML usw.) und umgekehrt.

Die Konvertierung in ein serialisierbares Objekt wird als Marshalling bezeichnet. Die Klasse TJSONMarshal konvertiert Benutzerobjekte in TJSONValue-Objekte. Der umgekehrte Vorgang wird als Unmarshalling bezeichnet. TJSONUnMarshal setzt einen TJSONValue zurück auf ein Benutzerobjekt.

Das Marshalling wird anhand eines Benutzermusters vorgenommen, das von der Klasse TTypeMarshaller implementiert wird. In vorbestimmten Situationen werden Ereignisse ausgegeben. Die folgende Tabelle enthält die Liste der Situationen, die während des Marshalling auftreten können.



Situation Ereignis

Ein neues Objekt wird gefunden.

OnTypeStart

Ein bereits besuchtes Objekt wird gefunden.

OnRefType

Ein neuer Objektinhalt wurde erneut besucht.

OnTypeEnd

Ein neues Feld wird gefunden.

OnFieldStart

Ein neues Feld wird besucht.

OnFieldEnd

Ein Stringwert wird gefunden.

OnString

Ein numerischer Wert wird gefunden.

OnNumber

Ein Nil-Wert wird gefunden.

OnNull

Ein boolescher Wert wird gefunden.

OnBoolean

Ein Listenwert wird gefunden.

OnListStart

Die Verarbeitung einer Liste ist beendet.

OnListEnd



Die Ereignisse werden von einer TConverter-Instanz empfangen. Abhängig von der Struktur des Benutzerobjekts sind diese teilweise verdeckt. Die TConverter-Instanz erstellt auf der Grundlage der Ereignisse und ihrer Argumente ein äquivalentes Abbild des Benutzerobjekts. Ein JSON-Konverter wird von TJSONConverter implementiert.

Das vom Konverter erstellte Objektabbild kann u.a. für die Erhaltung der Persistenz verwendet werden. Mit diesem Abbild kann das ursprüngliche Benutzerobjekt mithilfe von Reverter-Ereignissen, die von einem Unmarshaller gesteuert werden, neu gebildet werden. TJSONUnMarshal verwendet ein JSON-Abbild zum Wiederherstellen des Benutzerobjekts. Das Unmarshalling ist ein einfacher Vorgang, der zum Neubilden des Benutzerobjekts RTTI verwendet. Es wird angenommen, dass das Benutzerobjekt einen Konstruktor ohne Argumente hat.

Das Marshalling wandelt alle Felder in Strings, Zahlen und boolesche Werte um. Um komplexere Felder umzuwandeln, sind Benutzer-Konverter und -Reverter erforderlich. Benutzer-Konverter und -Reverter können bei der Marshaller- und Unmarshaller-Instanz vor Beginn einer Verarbeitung registriert werden.

Konverter und Reverter können für einen Typ und ein Feld oder für einen Typ registriert werden. Alle deklarierten Felder dieses Typs werden von dem bereitgestellten Benutzer-Konverter/Reverter verarbeitet. Ein bei einem Feld registrierter Konverter/Reverter hat Vorrang vor einem Typkonverter/Reverter.

Ein Feldkonverter kann einen Feldwert in einen String, ein Objekt, eine String-Liste oder eine Objektliste umwandeln. Diese umgewandelten Werte werden als Argumente an den entsprechenden Reverter übergeben, um den Feldwert neu zu bilden.

Ein Typkonverter kann einen Wert in einen String, ein Objekt, eine String-Liste oder eine Objektliste umwandeln. Diese werden als Argumente an den Typ-Reverter übergeben, um die ursprüngliche Typinstanz neu zu bilden.

Ein TStringList-Feld kann beispielsweise von einem Konverter in ein String-Array umgewandelt werden, und ein Reverter kann anhand der String-Liste eine Instanz von TStringList erstellen und füllen. Ein benutzerdefinierter Konverter/Reverter sollte über diesen Komplexitätsgrad verfügen.

Da die RTTI leistungsfähiger wird, und mehr Metadaten im Bibliothekscode gespeichert werden können, werden benutzerdefinierte Konverter immer weniger gebraucht.

Für die folgenden Felder ist bereits eine integrierte Konvertierung/Reversion vorhanden: Integer, String, Char, Aufzählung, Float, Objekt, Record. Bei den folgenden Typen werden die Feldwerte ignoriert, und es wird eine Benutzerkonvertierung erwartet: Menge, Methode, Variante, Interface, Zeiger, dynArray, classRef, Array.

TTypeMarshaller unterstützt die Objekt-ID-Markierung und die Konverterregistrierung. Eine Spezialisierung dieser Klasse stellt normalerweise den Serialisierungstyp bereit.

Siehe auch