(一)
序列化:将java对象转换为字节序列的过程叫做序列化

反序列化:将字节对象转换为java对象的过程叫做反序列化

通常情况下,序列化有两种用途:

1) 把对象的字节序列永久的保存在硬盘中

2) 在网络上传输对象的字节序列

序列化和反序列化主要的API:
— ObjectInputStream
— readObject()
— ObjectOutputStream
— writeObject(Object)

只有实现了Serializable或者Externalizable接口的类的对象才能够被序列化。否则当调用writeObject方法的时候会出现IOException。

需要注意的是Externalizable接口继承自Serializable接口。两者的区别如下:

  1. 仅仅实现Serializable接口的类可应采用默认的序列化方式。比如String类。

    • 假设有一个Customer类的对象需要序列化,如果这个类仅仅实现了这个接口,那么序列化和反序列化的方式如下:ObjectOutputStream采用默认的序列化方式,对于这个类的非static,非transient的实例变量进行序列化。ObjectInputStream采用默认的反序列化方式,对于这个类的非static,非transient的实例变量进行反序列化。
    • 如果这个类不仅实现了Serializable接口,而且定义了readObject(ObjectInputStream in)和 writeObject(ObjectOutputStream out)方法,那么将按照如下的方式进行序列化和反序列化:ObjectOutputStream会调用这个类的writeObject方法进行序列化,ObjectInputStream会调用相应的readObject方法进行反序列化。
  2. 实现Externalizable接口的类完全由自身来控制序列化的行为。而且必须实现writeExternal(ObjectOutput out)和readExternal(ObjectInput in)。那么将按照如下的方式进行序列化和反序列化:ObjectOutputStream会调用这个类的writeExternal方法进行序列化,ObjectInputStream会调用相应的readExternal方法进行反序列化。

几点需要注意的:
1. 序列化关注的是对象的状态,所以对于static不会进行序列化,static为类的状态;
2. transient修饰的变量不会进行序列化;
3. 采用默认的序列化方式(实现Serializable接口),反序列化时是直接根据序列化保存的内容进行重构的(无需调用构造函数);另外需要注意的是,如果由一个ObjectOutputStream对象多次序列化同一个对象,那么由一个objectInputStream对象反序列化后的也是同一个对象;
4. 如果要对transient变量进行序列化,只需要自己实现writeObject和readObject方法即可;
5. 序列化和反序列化产生的对象是不一样的,如果要保证单例,需要实现readResolve()方法;
6. 实现Externalizable接口在反序列化时会调用无参构造函数!

参考:http://www.cnblogs.com/rollenholt/archive/2012/11/26/2789445.html

(二)
java序列化为XML
可以使用XStream工具,方便简单,简单代码如下:

package com.luxia;
import java.io.Serializable;/*** 可序列化的对象* @author wangluxia**/
public class SerialObject implements Serializable{private static final long serialVersionUID = 1L;private String name;private int id;private int value;public SerialObject(){}public SerialObject(String name,int id,int value){this.name=name;this.id=id;this.value=value;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}
}

XStream实现java对象序列化为XML:

package com.luxia;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;public class XmlSerial2 {public void serialObject(OutputStream os,Object o){XStream xStream=new XStream();try {os.write(xStream.toXML(o).getBytes("utf8"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public Object deSerialObject(InputStream is){XStream xStream=new XStream();return xStream.fromXML(is);}public static void main(String[] args){XmlSerial2 xs=new XmlSerial2();File file=new File("objetc2.xml");try {SerialObject o=new SerialObject("java 序列化",2,24);FileOutputStream fos=new FileOutputStream(file);xs.serialObject(fos, o);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {FileInputStream fis=new FileInputStream(file);SerialObject oo=(SerialObject) xs.deSerialObject(fis);System.out.println(oo.getName()+"  "+oo.getId()+"  "+oo.getValue());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

运行结果:

<com.luxia.SerialObject><name>java 序列化</name><id>2</id><value>24</value>
</com.luxia.SerialObject>

注意:在反序列化xml时,需要添加xpp3.jar包

java序列化json更简单,添加jettison.jar包

public void java2json(OutputStream os,Object o){XStream xStream=new XStream(new JettisonMappedXmlDriver());xStream.setMode(XStream.NO_REFERENCES);xStream.alias("SerialObject",SerialObject.class);System.out.println(xStream.toXML(o));}

运行结果:

{"SerialObject":{"name":"java 序列化","id":2,"value":24}}

XStream框架还有很多有用的工具和方法,对于序列化java对象非常方便。

JAVA序列化标准格式(XML、JSON)相关推荐

  1. [WEB API] CLIENT 指定请求及回应格式(XML/JSON)

    [Web API] Client 指定请求及响应格式(xml/json) Web API 支持的格式请参考 http://www.asp.net/web-api/overview/formats-an ...

  2. java geojson_GEOJSON标准格式学习

    最近做的项目需要详细了解geojson,因此查了一些资料,现在整理一份标准格式的记录,要理解本文需要首先了解json的基本知识,这里不过多展开,可以去参考w3school上的教程,简言之,json是通 ...

  3. 万能的数据传输格式——XML/json

    一.XML简介 1.历史起源 gml(1969)->sgml(1985)->html(1993)->xml(1998) Genaral  Markup  language gml : ...

  4. python-非标准格式json文件读取报错解决办法

    不是所有以.json结尾的文件,里面的数据都是标准的json格式. 如,以下名为countries.json文件中的数据格式,就是非标准化的json数据格式. 注:json标准格式中,字符串必须用双引 ...

  5. 2020-08-23 html的标签预加载 + css的新知识 + JS的json的标准格式 + 软技能的能说会道vs安静做事

    2020-08-23 题目来源:http://www.h-camel.com/index.html [html] html的哪个标签可以预加载? 通过浏览器特性来提高资源加载速度的方法: 1.DNS ...

  6. java 序列化 文件_一种恢复Java序列化文件数据的方法与流程

    本发明涉及信息安全技术领域,特别涉及一种恢复Java序列化文件数据的方法. 背景技术: 在数据解析恢复领域经常会遇到序列化文件的解析.Java序列化是Java 自身提供的一种数据序列化方式,它允许开发 ...

  7. kryo java_优化Java序列化– Java,XML,JSON,Kryo,POF

    kryo java 也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,而且由于每个JDK似乎都比 ...

  8. 优化Java序列化– Java,XML,JSON,Kryo,POF

    也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法. 毕竟Java是第7个主要发行版,所以这不是新技术,并且由于每个JDK似乎都比上一个快,因此我错误 ...

  9. Ajax--概述、xhr对象的常用属性和方法、xhr的常用事件、xhr对象发送POST请求、xhr对象发送GET请求、xhr对象的兼容性问题、数据交换格式(XML、JSON)

    一.概述 1.1 发展历程 在开始之前先来看一下Ajax的工作原理吧,如下图所示: Ajax全称Asynchronous javascript and xml(异步 JavaScript 和 XML) ...

最新文章

  1. 缓存穿透与击穿问题解决方案
  2. python如何安装panda数据库_python怎么安装pandas
  3. o oia ospf 路由优先_动态路由OSPF中注入默认路由,原来都是这么玩的,进去看看...
  4. asp 去除最后一个逗号为空字符串的代码
  5. linux配置英文,linux 系统配置命令(国外英文资料).doc
  6. git fetch和git pull
  7. BEA-141281 unable to get file lock, will retry ...
  8. linux echo写php编码,linux使用和基础操作(示例代码)
  9. 在vue中methods互相调用的方法
  10. centos8安装并启动tomcat9
  11. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
  12. 实验8 SQL Server 的存储过程
  13. [转载] KAFKA分布式消息系统
  14. 使用Python音频双通道分离
  15. 使用哈工大LTP做自然语言处理任务基础demo
  16. yum mysql my.ini_Centos7 yum安装mysql
  17. C#调用系统的复制、移动、删除文件对话框
  18. 免费申请国外大学edu教育邮箱安装微软office全家桶
  19. 看完就能出去神侃,来自研发第一线的“区块链”扫盲文(二)
  20. iPhone模拟器里面模拟两个手指做放大缩小的手势

热门文章

  1. 三菱FX5U-绝对定位指令 DRVA(DDRVA) 两种写法
  2. 【操作系统①】——操作系统的定义和功能、操作系统的四大特征【并发 共享 虚拟 异步】
  3. 锁定“嵌入式AI”应用 中科创达启动第二轮成长
  4. Liunx配置yum源与本地配置yum源
  5. Android 9.0 蓝牙扫描流程
  6. 老笔记整理二:网页小问题汇总
  7. 网络对抗技术---实验一
  8. 【阅读笔记】这本书可以让你戒烟
  9. Photo Album: 8.14 庞贝-那不勒斯
  10. sql 关于一表多个主键唯一性的约束