序列化和反序列的理解
序列化的实现
参与序列化和反序列的对象必须实现Serializable接口
Serializable接口只是一个标志接口(这个接口中什么代码都没有),
起到标志的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊待遇,
每个实现序列化接口的类中都会有一个序列化版本号
* @see java.io.ObjectOutputStream //对象输出流 将文件从内存中序列化到硬盘中
* @see java.io.ObjectInputStream //对象输入流 将硬盘中的文件反序列化到内存中
* @see java.io.ObjectOutput
* @see java.io.ObjectInput
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
public static void main(String[] args) throws Exception {
//这个对像需要实现序列化接口(标志作用)
Student student = new Student(111, 22);
//序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("student"));
//从内存中序列化到硬盘中
oos.writeObject(student);
oos.flush();
oos.close();
}
反序列化
反序列化时 序列化的序列化id和反序列的ID要一致
/*
* 反序列化
* */
public static void main(String[] args) throws Exception{
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("student"));
Object object = ois.readObject();
System.out.println(object);
ois.close();
}
一次序列化多个对象
参与序列化的ArrayList集合中以及集合中的元素User都需要实现java.io.Serializable
package com.aaa.javase.pojo;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/*
* 序列化多个对像
* */
public class ObjectArrayListTest {
public static void main(String[] args) throws Exception {
List<User> list=new ArrayList<>();
list.add(new User(1,"张三"));
list.add(new User(2,"李四"));
list.add(new User(3,"王五"));
//开始序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("user"));
oos.writeObject(list);
oos.flush();
oos.close();
}
}
反序列化多个对象
/*
* 反序列化
* */
public class ObjectInputArrayListTest {
public static void main(String[] args) throws Exception{
//反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("user"));
//因为知道这个序列化是List集合所以可以进行
//强制类型转换
List<User> object = (List<User>) ois.readObject();
for (User user : object) {
System.out.println(user);
}
ois.close();
}
transient关键字的使用
transient 关键字表示游离的,不参与序列化
只要有这个关键字修饰的字段都不参与序列化
private transient String name;
关于序列化版本号
IDEA中生成序列化版本号
在IDEA中 file ->Editor->Inspections下
//在实现序列化的类中的添加序列化版本号,这个序列化版本号
//具有全球唯一性
//可以使用IDEA工具生成,也可以自己写
private static final long serialVersionUID = 5864733701950787406L;