Java序列化与反序列化是什么?
序列化: 把Java对象转换成字节序列
,然后通过InputStream和OutputStream将内存中的类持久化到硬盘或者网络中传输
反序列化: 把字节序列
恢复为Java对象的过程
等价描述:有序字节流,字节序列
为什么需要序列化与反序列化?
对象、文件、数据,有许多不同的格式
,很难统一传输和保存。序列化以后就都是 字节流
了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存
,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。
序列化应用场景
1、将内存中的类持久化到文件或数据库
2、对象序列化可以实现分布式对象
RMI
(即远程调用Remote Method Invocation) 要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
RPC
(Remote Procedure Call,远程过程调用)
3、网络传输
序列化特点
1、递归保存
java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
利用对象序列化可以进行对象的"深复制"
。
哪些类可以序列化?
1、String
2、枚举
3、实现Serializable
接口或Externalizable
接口
Serializable 和 Externalizable区别?
什么是serialVersionUID
让某个字段不被持久化,也就是不被数据库存储怎么办?
Java中常用的序列化框架:
Java中常用的序列化框架: java原生、gson、fastjson、jackson等。
java原生序列化和反序列化执行路径:
writeObject
writeObject0
(判断类是否是自定义类)
writeOrdinaryObject
(区分Serializable和Externalizable)
writeSerialData
(序列化fields)
invokeWriteObject
(反射调用类自己的序列化策略)
如果被序列化的类中定义了 writeObject
和 readObject
方法,虚拟机会试图调用对象类里的 writeObject
和 readObject
方法,进行用户自定义的序列化和反序列化。
如果被序列化的类没有定义这2个方法,则默认调用是 ObjectOutputStream.defaultWriteObject
和ObjectInputStream.defaultReadObject
方法来执行序列化和反序列化。