1.什么是序列化, 反序列化
序列化:把对象转换为字节序列的过程
反序列化:把字节序列恢复成对象的过程
有时候我们想把一些信息持久化保存起来,那么序列化的意思就是把内存里面的这些对象给变成一连串的字节描述的过程。 常见的就是变成文件。
但是问题来了,我就算不序列化,也可以保存到文件当中。有什么问题吗?
答:序列化的原本意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变换成字节序列后才能进行远程通信,即在网络上传送对象的字节序列。
2 什么时候需要序列化
1、把内存中的java对象状态保存到一个文件中或者数据库中时候;
2、 用套接字在网络上传送对象的时候;
3 实现序列化的方式
实现序列化本身是跟语言无关的:
一些实现序列化的方式:
0、Java对象序列化
1、JSON序列化
2、XML
3、Protostuff
4、Hession(它基于HTTP协议传输,使用Hessian二进制序列化,对于数据包比较大的情况比较
友好。)
5、Dubbo Serialization(阿里dubbo序列化)
6、FST(高性能、序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右)
4.1如何实现序列化(Java对象序列化)
该类需要实现Serializable 接口
ObjectOutputStream 代表对象输出流: 它的 writeObject(Object obj) 方法可对参数指定的 obj
对象进行序列化,把得到的字节序列写到一个目标输出流中。
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(new File("e:/person.txt")));
oos.writeObject(person);
System.out.println("person 对象序列化成功!");
oos.close();
}
ObjectInputStream 代表对象输入流:它的 readObject() 方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new
File("e:/person.txt")));
Person person = (Person) ois.readObject();
System.out.println("person 对象反序列化成功!");
注意:transient 修饰的属性 和 static修饰的静态属性,是不会被序列化的
在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,最好设置为1L,这
个L最好大写来区分,不然小写看起来像是1,不同的 serialVersionUID 的值,会影响到反序列化 .