Существует несколько способов сериализации и десериализации данных. Самые популярные из них:
- В формате XML через CALL TRANSFORMATION
- В формате JSON через класс /UI2/CL_JSON
- В кластер данных через оператор EXPORT
В некоторых случаях, помимо самих данных, требуется сериализовать тип данных (например, если тип сериализуемых данных определяется в рантайме). Сделать это можно через класс CL_SALV_BS_DDIC.
XML сериализация
1 2 3 4 5 6 7 8 9 10 |
DATA lt_data TYPE TABLE OF tadir. DATA lv_xml TYPE string. CALL TRANSFORMATION id SOURCE model = lt_data RESULT XML lv_xml. CALL TRANSFORMATION id SOURCE XML lv_xml RESULT model = lt_data. |
JSON сериализация
1 2 3 4 5 6 7 8 9 10 11 |
DATA lt_data TYPE TABLE OF tadir. DATA lv_json TYPE string. lv_json = /ui2/cl_json=>serialize( data = lt_data compress = abap_true ). CALL METHOD /ui2/cl_json=>deserialize EXPORTING json = lv_json CHANGING data = lt_data. |
ZIP-сжатие данных
Данные в формате XML или JSON, как правило, избыточны. Если вы сериализуете данные для записи в лог или для передачи по RFC, то их лучше предварительно сжать. Сделать это можно через класс CL_ABAP_GZIP.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DATA lv_xml TYPE string. DATA lv_zip TYPE xstring. CALL METHOD cl_abap_gzip=>compress_text EXPORTING text_in = lv_xml IMPORTING gzip_out = lv_zip. CALL METHOD cl_abap_gzip=>decompress_text EXPORTING gzip_in = lv_zip IMPORTING text_out = lv_xml. |
EXPORT в DATA CLUSTER
Используя оператор EXPORT можно сохранять данные в XSTRING. Оператор EXPORT поддерживает сжатие данных используя дополнение COMPRESSION ON.
1 2 3 4 5 6 7 8 9 10 11 |
DATA lt_data TYPE TABLE OF tadir. DATA lv_data TYPE xstring. " Сохранение в кластер EXPORT data = lt_data TO DATA BUFFER lv_data. " Сохранение с сжатием EXPORT data = lt_data TO DATA BUFFER lv_data COMPRESSION ON. " Восстановление данных IMPORT data = lt_data FROM DATA BUFFER lv_data. |
Сериализация типов данных
Иногда возникает необходимость сериализовать вместе с данными их тип. Например, если тип данных определяется во время выполнения, то для десериализации необходимо сначала восстановить тип данных, а затем сами данные. Сделать это можно через класс CL_SALV_BS_DDIC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DATA lt_data TYPE TABLE OF tadir. DATA lt_components TYPE if_salv_bs_t_data=>t_type_component. " Сохранение типа данных lt_components = cl_salv_bs_ddic=>get_components_by_data( lt_data ). " Восстановление типа данных DATA lo_data TYPE REF TO data. FIELD-SYMBOLS <l_data> TYPE any. CALL METHOD cl_salv_bs_ddic=>create_data_from_components EXPORTING t_component = lt_components IMPORTING r_data = lo_data. ASSIGN lo_data->* TO <l_data>. |
Сравнение вариантов сериализации
Стоит отметить, что если в структуре сериализуемых данных содержится большое количество INITIAL полей, то при сериализации в XML или JSON форматы эти данные записываться не будут. Соответственно, размер выходных данных будет меньше. Ниже приведены сравнительные характеристики способов сериализации. В качестве теста была взята таблица BSEG размером в 50 тыс. строк.
Время | Размер | [ZIP] Время | [ZIP] Размер | |
---|---|---|---|---|
XML | 6,07 сек | 274,97 Мб | 12,93 сек | 2,97 Мб |
JSON | 36,56 сек | 33,18 Мб | 37,19 сек | 0,85 Мб |
DATA | 0,20 сек | 234,19 Мб | 1,89 сек | 11,13 Мб |
Присоединиться к обсуждению...