Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Serialize an object wir TYPE REF TO attribute.

mykola_tokariev2
Explorer
0 Likes
2,059

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?

1 ACCEPTED SOLUTION
Read only

Sandra_Rossi
Active Contributor
1,758

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'.
3 REPLIES 3
Read only

Sandra_Rossi
Active Contributor
1,759

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'.
Read only

0 Likes
1,758

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.


Read only

1,758

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.