Data.DBXJSONReflect.TTypeMarshaller
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. |
|
Ein bereits besuchtes Objekt wird gefunden. |
|
Ein neuer Objektinhalt wurde erneut besucht. |
|
Ein neues Feld wird gefunden. |
|
Ein neues Feld wird besucht. |
|
Ein Stringwert wird gefunden. |
|
Ein numerischer Wert wird gefunden. |
|
Ein Nil-Wert wird gefunden. |
|
Ein boolescher Wert wird gefunden. |
|
Ein Listenwert wird gefunden. |
|
Die Verarbeitung einer Liste ist beendet. |
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.