‎2021 Nov 19 7:47 PM
Dear SAP community,
I tried to save serialized object to DB table. The problem is that this approach doesn't work for classes with attribute TYPE REF TO.
My class looks like this:
CLASS zcl_mock DEFINITION
PUBLIC
CREATE PUBLIC.
INTERFACES IF_SERIALIZABLE_OBJECT .
PUBLIC SECTION.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mock_data TYPE REF TO data.
ENDCLASS.
CLASS zcl_mock IMPLEMENTATION.
...
ENDCLASS.
Do you have any idea how can I solved this problem?
‎2021 Nov 19 8:11 PM
No problem for me, with option data_refs = 'heap-or-create':
<?xml version="1.0" encoding="UTF-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OBJ href="#o9" />
</asx:values>
<asx:heap xmlns:dic="http://www.sap.com/abapxml/types/dictionary" xmlns:cls="http://www.sap.com/abapxml/classes/global" xmlns:abap="http://www.sap.com/abapxml/types/built-in" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prg:ZCL_MOCK xmlns:prg="http://www.sap.com/abapxml/classes/program/ZZSRO_TEST8" id="o9">
<local.ZCL_MOCK>
<MOCK_DATA href="#d2" />
</local.ZCL_MOCK>
</prg:ZCL_MOCK>
<xsd:int id="d2">5</xsd:int>
</asx:heap>
</asx:abap>ABAP program:
REPORT.
CLASS zcl_mock DEFINITION
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES IF_SERIALIZABLE_OBJECT .
methods constructor.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mock_data TYPE REF TO data.
ENDCLASS.
CLASS zcl_mock IMPLEMENTATION.
METHOD constructor.
create data mock_data type i.
cast i( mock_data )->* = 5.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
data(obj) = new zcl_mock( ).
CALL TRANSFORMATION ID source obj = obj result xml data(xstring)
OPTIONS data_refs = 'heap-or-create'.
‎2021 Nov 19 8:11 PM
No problem for me, with option data_refs = 'heap-or-create':
<?xml version="1.0" encoding="UTF-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OBJ href="#o9" />
</asx:values>
<asx:heap xmlns:dic="http://www.sap.com/abapxml/types/dictionary" xmlns:cls="http://www.sap.com/abapxml/classes/global" xmlns:abap="http://www.sap.com/abapxml/types/built-in" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<prg:ZCL_MOCK xmlns:prg="http://www.sap.com/abapxml/classes/program/ZZSRO_TEST8" id="o9">
<local.ZCL_MOCK>
<MOCK_DATA href="#d2" />
</local.ZCL_MOCK>
</prg:ZCL_MOCK>
<xsd:int id="d2">5</xsd:int>
</asx:heap>
</asx:abap>ABAP program:
REPORT.
CLASS zcl_mock DEFINITION
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES IF_SERIALIZABLE_OBJECT .
methods constructor.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mock_data TYPE REF TO data.
ENDCLASS.
CLASS zcl_mock IMPLEMENTATION.
METHOD constructor.
create data mock_data type i.
cast i( mock_data )->* = 5.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
data(obj) = new zcl_mock( ).
CALL TRANSFORMATION ID source obj = obj result xml data(xstring)
OPTIONS data_refs = 'heap-or-create'.
‎2021 Nov 20 8:13 PM
Hey sandra.rossi,
thank you for your answer. Your example works fine. But if I set some table to mock_data attribute, I get an CX_REFERENCE_NOT_SERIALIZABLE exception. You can see the example below:
REPORT.
CLASS zcl_mock DEFINITION
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_serializable_object .
METHODS constructor.
DATA mock_data TYPE REF TO data.
ENDCLASS.
CLASS zcl_mock IMPLEMENTATION.
METHOD constructor.
FIELD-SYMBOLS: <flight> TYPE any.
SELECT * FROM sflight INTO TABLE @DATA(sflight_tab) UP TO 10 ROWS.
CREATE DATA mock_data TYPE TABLE OF ('SFLIGHT').
ASSIGN mock_data->* TO <flight>.
<flight> = sflight_tab.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(obj) = NEW zcl_mock( ).
CALL TRANSFORMATION id SOURCE obj = obj RESULT XML DATA(xstring)
OPTIONS data_refs = 'heap-or-create'.
DATA deser_obj TYPE REF TO zcl_mock.
CALL TRANSFORMATION id SOURCE XML xstring RESULT obj = deser_obj.
‎2021 Nov 20 10:44 PM
As explained in the ABAP documentation, it doesn't work with "internal types" (also called "bound types"). You must use DDIC Types or Standalone Types. For example, with a Standalone Type:
TYPES ty_sflight_lines TYPE STANDARD TABLE OF SFLIGHT WITH EMPTY KEY.
CREATE DATA mock_data TYPE ty_sflight_lines.