Serialize me
Das Interface IF_SERIALIZABLE_OBJECT läuft einem hin und wieder in SAP-Standardklassen über den Weg.
Was ist Serialisierung?
Wikipedia sagt über Serialisierung:
Die Serialisierung ist in der Informatik eine Abbildung von strukturierten Daten auf eine sequenzielle Darstellungsform.
Eine der bekanntesten Anwendungen für die Serialisierung ist das JSON-Format, in dem komplexe Daten in einer lesbaren Form dargestellt werden können.
Eine andere Form der Serialisierung lässt sich mit XML bewerkstelligen.
Interface IF_SERIALIZABLE_OBJECT
Damit ein Objekt (Klasse) serialisierbar ist, muss es das Interface IF_SERIALIZABLE_OBJECT implementieren:
CLASS lcl_serialize_me DEFINITION. PUBLIC SECTION. INTERFACES if_serializable_object. DATA mt_t005 TYPE STANDARD TABLE OF t005. DATA mt_t005t TYPE STANDARD TABLE OF t005t. ENDCLASS.
Zur Demonstration habe ich die zwei öffentlichen Attribute MT_T005 und MT_T005T hinzugefügt.
Um die Klasse nutzen zu können, muss sie instantiiert werden:
DATA ref TYPE REF TO lcl_serialize_me. CREATE OBJECT ref.
In die Tabellen laden wir nun alle EG-Länder inklusive Texte:
SELECT * FROM t005 INTO TABLE ref->mt_t005 WHERE xegld = abap_true. IF sy-subrc = 0. SELECT * FROM t005t INTO TABLE ref->mt_t005t FOR ALL ENTRIES IN ref->mt_t005 WHERE land1 = ref->mt_t005-land1 AND spras = sy-langu. ENDIF.
Somit haben wir eine Objektreferenz erzeugt, die ein paar Daten enthält.
Diese Daten sind auch serialisierbar. Andere Daten, wie zum Beispiel Attribute mit Referenzen zu anderen Klassen, sind nicht serialisierbar.
Deswegen darf das Interface IF_SERIALIZABLE_OBJECT nur dann implementiert werden, wenn alle Attribute der Klasse für die Serialisierung geeignet sind.
Serialisierung
Nun soll das Objekt mittels XML serialisiert werden. Das geht schnell und einfach:
DATA ser TYPE string.
CALL TRANSFORMATION id SOURCE model = ref RESULT XML ser.
Das Ergebnis ist ein lesbarer XML-String (Ausschnitt):
Tipp: Im Debugger ist es möglich, einen XML-String komplett darstellen zu lassen:
Speicherplatz sparen
Da die Tabellen gefüllt sind, ist das Objekt recht groß geworden. Mit GZIP schrumpfen wir es auf eine kleinere Größe:
DATA zip TYPE xstring. cl_abap_gzip=>compress_text( EXPORTING text_in = ser IMPORTING gzip_out = zip ).
Dies aber nur nebenbei…
Deserialisierung
Nun möchten wir das serialisierte Objekt natürlich irgendwo speichern, ablegen oder verschicken.
Das ist jedoch nur sinnvoll, wenn wir es auch wieder deserialisieren können…
Die Objektreferenz ist in dem Fall natürlich leer:
CLEAR ref.
Die Deserialisierung funktioniert ebenfalls mittel CALL TRANSFORMATION in der Standardvariante:
CALL TRANSFORMATION id SOURCE XML ser RESULT model = ref.
Im Debugger kannst du überprüfen, dass die komplette Referenz wiederhergestellt wurde. Das ist fast schon Zauberei… 🙂
Vielen Dank an Haubi für diese Idee!
Nutzen
Wozu die Serialisierung und Deserialisierung tatsächlich nützlich ist, wird man wahrscheinlich erst wissen, wenn man es braucht. Daher ist es in jedem Fall gut zu wissen, dass es funktioniert.
DEMO
Ein einfaches Demoprogramm ist DEMO_SERIALIZABLE_OBJECT. Hier wird ebenfalls die Serialisierung demonstriert.
Wer ein komplexes Demoprogramm zur Konvertierung von (Daten-) Typen sehen möchte, sollte sich das Programm STRANSDEMO_FLIGHTS anschauen.
Viel Spaß damit; mir ist es zu kompliziert!
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024