1、什么是序列化和反序列化
Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;
2、为啥需要序列化技术呢?
网络通信中可以传送二进制序列形式的图片、视频、文本。那么对象也能通过这种形式传送,运用的技术就是序列化。
3、序列化算法执行过程
Java的序列化算法
- 序列化算法一般会按步骤做如下事情:
- 将对象实例相关的类元数据输出。(元数据Annotation就是添加到程序元素如方法、字段、类和包上的额外信息,通俗来讲就是用于描述数据的数据)
- 递归地输出类的超类描述直到不再有超类。
- 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
- 从上至下递归输出实例的数据
4、序列化的代码过程
4.1 序列化对象
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
serialVersionUID : 如果不设置,那么系统会根据类的信息来计算出一个UID,那么修改类的属性时,根据类计算出来的UID就会不一样。如果反序列化得到的对象,就造成了两个UID不一致,因此造成错误。
显式地定义serialVersionUID有两种用途:
- 1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
- 2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
class MyObject implements Serializable{
private static final long serialVersionUID = 888L;
}
4.2 序列化
public void save(){
try{
MyObject myObject = MyObject.getInstance();
FileOutputStream fosRef = new FileOutputStream(new File(
"myObject.txt"
));
ObjectOutputStream oosRef = new ObjectOutputStream(fosRef);
oosRef.writeObject(myObject);
oosRef.close();
fosRef.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
4.3 反序列化
public void read(){
try{
FileInputStream fisRef = new FileInputStream(new File(
"myObject.txt"
));
ObjectInputStream iosRef = new ObjectInputStream(fisRef);
MyObject myObject = (MyObject) iosRef.readObject();
System.out.println("read: " + myObject.hashCode());
iosRef.close();
fisRef.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
5、相关注意事项
- 序列化保存的是对象的状态,而静态变量是类的状态;
- 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;