讨论三个问题:1.Java序列化和反序列是什么?
2.为什么要序列化和反序列化?
3.如何实现Java序列化与反序列化?
一、什么是Java序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程
这些字节序列可以用来存储或者传输
Java反序列化是指把字节序列恢复为Java对象的过程
二、为什么需要序列化和反序列化
当两个进程进行远程通信时,可以互相发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,若需要实现进程之间的对象传送,就需要Java序列化和反序列化了。
换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象
Java序列化的好处:1、实现了数据的持久化,通过序列化可以把内存中的对象转换为二进制字节序列,然后写入我们的磁盘中永久保存;;2、利用序列化实现远程通信,即在网络上传送对象的字节序列
三、如何实现Java序列化与反序列化
只有实现了Serializable或Externalizable接口的类的对象才能被序列化(是对象是完成序列化和反序列化),否则抛出异常
利用JDK中的 对象的输入输出流(ObjectInput/OutputStream) 可以完成对象的序列化和反序列化
序列化是对象到数据。反序列化是数据还原对象。而FileOutputStream这种是文件操作。只有数据。没有对象转换概念,但是我们需要借助他来完成数据的提取和回送等
举例:
JDK类库中序列化的步骤
步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:
ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“D:\objectfile.obj”));
步骤二:通过对象输出流的writeObject()方法写对象:
out.writeObject(“Hello”);
out.writeObject(new Date());
5)JDK类库中反序列化的步骤
步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:
ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\objectfile.obj”));
步骤二:通过对象输出流的readObject()方法读取对象:
String obj1 = (String)in.readObject();
Date obj2 = (Date)in.readObject();
说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。
JSON数据的序列化和反序列化
不同的进程之间进行远程通信时,常常会采用JSON这种数据交换格式,来交换信息,所以JSON数据的序列化和反序列也经常被使用到。
目前有几种JSON工具,下面以 阿里巴巴的FastJSON 为例简单说明一下
JSON.parseObject JSON反序列化,将JSON字符串,转换成一个JSON对象
JSON.toJSONString JSON序列化
感觉parse的过程只是反序列化的一部分,parseObject是把JSON字符串 转换成一个JSON对象,但是我们通信的时候是用的字节序列
那么字节序列到JSON字符串还是有一个过程,这个过程应该是传输(request、response)的某个过程中满足JSON协议标准,可以讲我们的字节序列 转成 JSON字符串的形式
总结:
1)Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
2)采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。