ABAP,Java和JavaScript的序列化,反序列化
ABAP
1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_xstring和xml_xstring_to_abap实现两种格式的互换。
REPORT zxm.
DATA: ls_abap TYPE zzcrmost__pro001dotproduct1.
DATA: ls_line LIKE LINE OF ls_abap-item.
ls_line-logsys = 'AG3'.
ls_line-object_family = '0401'.
ls_line-product_id = 'MCF-0001'.
ls_line-product_type = '01'.
APPEND ls_line TO ls_abap-item.
ls_line-logsys = 'QDD'.
ls_line-object_family = '0402'.
ls_line-product_id = 'MCF-0002'.
ls_line-product_type = '02'.
APPEND ls_line TO ls_abap-item.
DATA(xml) = cl_proxy_xml_transform=>abap_to_xml_xstring( EXPORTING abap_data = ls_abap ddic_type = 'ZZCRMOST__PRO001DOTPRODUCT1' ).
DATA: ls_abap2 LIKE ls_abap,
ls_abap3 LIKE ls_abap.
cl_proxy_xml_transform=>xml_xstring_to_abap( EXPORTING ddic_type = 'ZZCRMOST__PRO001DOTPRODUCT1' xml = xml IMPORTING abap_data = ls_abap2 ).
ASSERT ls_abap2 = ls_abap.
最后一行的ASSERT语句,说明从ABAP格式转换成XML格式,再转换成ABAP格式,转换前的ABAP数据和转换后的ABAP数据是完全相同的。
如果我们单步调试工具类cl_proxy_xml_transform,发现它也没有神奇之处,
内部生成了一个ABAP simple transformation,以此来实现ABAP和XML格式的互相转换。
在调试器里记录下这个生成的transformation ID,然后用事务码STRANS打开,就可以看到明细了。
2. 有了方法1单步调试发现simple transformation的提示,我们可以用另一种更简单的办法实现两种格式的互换,即直接调用simple transformation:
DATA: lv_xml TYPE string.
CALL TRANSFORMATION id SOURCE b = ls_abap RESULT XML lv_xml.
生成的XML的根节点名称为b,因为上面代码调用参数SOURCE,将ABAP变量ls_abap传入时,绑定的参数名为“b”。
CALL TRANSFORMATION id SOURCE XML lv_xml RESULT b = ls_abap3.
ASSERT ls_abap2 = ls_abap3. 用这种方式进行ABAP->XML->ABAP仍然能得到最初的ABAP变量的值。
Java
定义一个简单的Employee类。
注意第12行代码,gender字段前面的关键字:transient。意思是告诉Java序列化框架,在序列化和反序列化时,不要考虑该gender字段。
第12行的代码将Employee类的实例,jerry写入了文件tempFile中。
将文件中的内容还原成对象实例:
打印输出:
Set id called: I042416
Employee {name='Jerry Wang', id=I042416, gender=male, birthday=Tue Aug 07 14:24:51 CST 2018}
Employee {name='Jerry Wang', id=I042416, gender=null, birthday=Tue Aug 07 14:24:51 CST 2018}
可以看到将原始对象实例序列化成文件,再反序列化成对象实例后,两个实例的内容除了gender字段因为刻意被忽略后,其他字段的值都相同。然而两个对象实例的地址已经在序列化前后已经发生了变化。
JavaScript
将JSON对象序列化成JSON字符串: JSON.stringify
var a = { "name": "Jerry", "skill": "Java" };
var b = JSON.stringify(a);
将JSON字符串反序列化成JSON对象:
var c = JSON.parse(b);
同Java一样,通过反序列化再序列化后得到的对象地址同原始对象不同。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
ABAP,Java和JavaScript的序列化,反序列化的更多相关文章
- Jerry的ABAP, Java和JavaScript乱炖
写这个系列的初衷是SAP Chengdu office有越来越多的应届毕业生加入,这些新同事通过在大学的专业学习,具备了Java和JavaScript背景,但是进入SAP之后大家觉得ABAP没有Jav ...
- java Serializable和Externalizable序列化反序列化详解--转
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- java Serializable和Externalizable序列化反序列化详解(转载)
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- java io流与序列化反序列化
java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入 ...
- 你真的会用ABAP, Java和JavaScript里的constructor么?
如果constructor里调用了一个成员方法,这个方法被子类override了,当初始化一个子类实例时,父类的构造函数被的调用,此时父类构造函数的上下文里调用的成员方法,是父类的实现还是子类的实现? ...
- Redis安装 java中的连接 序列化 反序列化
安装路径 /webapp/redis/redis- #启动redis /webapp/redis/redis-/src/redis-server & #关闭redis /webapp/redi ...
- 2.JAVA自带的序列化反序列化机制
- Java 使用 Jackson库 对 JavaMap 进行序列化反序列化
最近在用 java 处理一一些东西,发现 java 对对象进行序列化反序列化比起 python 来还是有些麻烦记录一下. 找了好几个库最后选择了 Jackson 感觉大家对它评价还不错. 将目标从 J ...
- java序列化反序列化深入探究
When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...
随机推荐
- SSE优化指令集编译错误: inlining failed in call to always_inline 'xxx': target specific option mismatch xxx
在用QtCreator编译SSE优化指令的时候,出现了如下错误, inlining failed in call to always_inline '__m128i _mm_packus_epi32( ...
- linux下c语言利用iconv函数实现utf-8转unicode
iconv是linux下的编码转换的工具,它提供命令行的使用和函数接口支持 man手册iconv命令用法如下: iconv -f encoding -t encoding inputfile 有如下选 ...
- JAVA学习笔记——(四)
今日内容介绍 1.流程控制语句switch 2.数组 3.随机点名器案例 01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪 ...
- 数据库中rs("ABC")与rs.Fields("ABC").value的差别(Rs是RecordSet对象)
透过RecordSet取得数据的时候我们要将数据显示出来时,假设字段名称是ABCABCX = rs("ABC")对于RecordSet来说....是把ABC这个[Fileds对象] ...
- WSAStartup()函数的使用
int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格 式: int PASCA ...
- 【转】mysql数据库的数据类型
一.数值类型 Mysql支持所有标准SQL中的数值类型,其中包括: 严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC ...
- mysql由浅入深探究(三)----mysql增删改查
通过前两节的学习,目前我们已经完成了数据库的安装,用户的创建及权限操作等相关操作,但是我们似乎我们只是隐隐约约接触到了数据库的一些基本操作,对数据库表还是比较陌生.那么现在我们呢开始了解一些数据库的一 ...
- unity2017分离动作
http://tsubakit1.hateblo.jp/entry/2015/06/01/235939 using UnityEngine; using UnityEditor; using Syst ...
- [UE4]C++静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
http://aigo.iteye.com/blog/2281373 原文作者:@玄冬Wong 相关内容: C++实现动态加载的问题:LoadClass<T>()和LoadObject&l ...
- 单例设计模式singleton
简单引入 单例设计模式作为最简单,最常用的设计模式.一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题.后面介绍标准写法,以规避这些问题. 1.懒汉式: /** * 问题在于,当 ...