本教程前一篇文章,我们学习了如何将 ABAP 变量,通过 CALL TRANSFORMATION 关键字,序列化成 XML 字符串的方法:
本教程我们更进一步,学习如何将一个包含了业务数据的 ABAP 类实例,序列化成 XML 字符串。
我们首先创建一个包含了业务数据的 ABAP 类。
为了简单起见,我们不在 SE24 事务码里创建一个全局类
,而是直接在 SE38 创建的 ABAP 报表里,定义一个局部类
。关于 ABAP 全局类和局部类的区别,笔者在这篇教程已经做了详细解释:
ABAP 源代码如下:
REPORT zst.
CLASS c1 DEFINITION.
PUBLIC SECTION.
INTERFACES if_serializable_object.
PROTECTED SECTION.
DATA carriers TYPE TABLE OF scarr.
ENDCLASS.
CLASS c2 DEFINITION INHERITING FROM c1.
PUBLIC SECTION.
METHODS constructor.
PRIVATE SECTION.
DATA lines TYPE i.
METHODS: serialize_helper
EXPORTING count TYPE i,
deserialize_helper
IMPORTING count TYPE i.
ENDCLASS.
CLASS c2 IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
SELECT * UP TO 2 ROWS
FROM scarr
INTO TABLE @carriers.
ENDMETHOD.
METHOD serialize_helper.
count = lines( carriers ).
ENDMETHOD.
METHOD deserialize_helper.
lines = count.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lo TYPE REF TO c2.
CREATE OBJECT lo.
简单说明一下这个报表的要点:
- 第三行定义了一个 ABAP 类 c1,实现了一个名叫
if_serializable_object
的接口。这个接口内没有定义任何方法,只是起一个标志作用,告诉 ABAP 框架,带有这个接口的 ABAP 类实例,可以被序列化成 XML
。 - c1 的
PROTECTED SECTION
定义了一个成员属性carriers
,该属性能够被 c1 和c1 子类
的实例所访问。
这个成员属性 carriers
,就是我们想序列化成 XML 的目标,它是一个内表结构,内表的行类型为数据库表 scarr 的行结构。
- 第 10 行定义了一个类 c2,它是 c1 的子类。在 c2 的构造函数里,从数据库表
scarr
里读取两行数据,存储到成员属性carriers
里。
执行上述的 ABAP 程序,运行时创建了一个 c2 的实例 lo,调试器里查看 lo 的属性:
其 carriers
属性包含两条记录:
下面我们学习如何将 ABAP 类实例 lo 序列化成 XML.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。