1、什么是序列化和反序列化
序列化:在JVM中把对象拷贝到二进制流中
反序列化:是把二进制流还原为对象
注意:序列化不仅仅是把对象以一连串字节描述的过程(其中涉及到流的输入输出操作),类被编译成二进制字节码文件加载到JVM中就不是序列化过程。
2.序列化的目的
1)对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象、进程间传输对象(RPC是分布式框架hadoop实现的基础就用到了对象的序列化)
2)序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制
2、什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候b)当你想用套接字在网络上传送对象的时候
c)当你想通过RMI传输对象的时候
3、ransient关键字
可以让序列化对象的某些属性放弃序列化的机会
4、对于序列化对象中有引用对象的情况
引用对象必须实现序化
5、实现序列化的方式
1)Serializable实现序列化:没有具体的方式
2)Externalizable也可以实现序列化:有具体的方法
6.Externalizable的API
void | readExternal(ObjectInput in) 对象实现 readExternal 方法来恢复其内容,它通过调用 DataInput 的方法来恢复其基础类型,调用 readObject 来恢复对象、字符串和数组。 |
void | writeExternal(ObjectOutput out) 该对象可实现 writeExternal 方法来保存其内容,它可以通过调用 DataOutput 的方法来保存其基本值,或调用 ObjectOutput 的 writeObject 方法来保存对象、字符串和数组。 |
7、对比
1.Serializable实现序列化不需要程序员手动的参与序列化的过程.JVM已经为我们实现了整个序列化的过程
2.Externalizable是Serializable的子类,需要程序员手动的参与序列化的过程,同时可以提供额外的数据的序列化.
3.Serializable序列化简单一些,但是要消耗性能,Externalizable比Serializable要高一些.
4.如果不需要过多的知道序列化的过程那么我们还是选者Serializable不容易出错,Externalizable比较容易出错
参考代码: