序列化和反序列化的含义:
序列化:就是将java对象转化成字节序列的过程。
反序列化:就是将字节序列转化成java对象的过程。
序列化的原因:
1.持久化:对象是存储在JVM中的堆区的,但是如果JVM停止运行了,对象也不存在了。序列化可以将对象转化成字节序列,可以写进硬盘文件中实现持久化。在新开启的JVM中可以读取字节序列进行反序列化成对象。
2.网络传输:网络直接传输数据,但是无法直接传输对象,可在传输前序列化,传输完成后反序列化成对象。所以所有可在网络上传输的对象都必须是可序列化的
序列化和反序列化的作用:
序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
实现方法
通过JDK提供的ObjectOutputStream和ObjectInputStream来实现序列化和反序列化
1.实现Serializable接口
public class TestBean implements Serializable {
private Integer id;
private String name;
private Date date; //省去getter和setter方法和toString
}
序列化
public static void main(String[] args) {
TestBean testBean = new TestBean();
testBean.setDate(new Date());
testBean.setId(1);
testBean.setName("hello");
//使用ObjectOutputStream序列化testBean对象并将其序列化成的字节序列写入test.txt文件
try (FileOutputStream fileOutputStream = new FileOutputStream("D:\\test.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);) {
objectOutputStream.writeObject(testBean);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
反序列化
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("D:\\test.txt");
ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream)) {
TestBean testBean = (TestBean) objectInputStream.readObject();
System.out.println(testBean);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
输出结果:
TestBean{id=1, name='hello', date=Fri Mar 24 17:54:48 CST 2023}
注意事项
1.如果序列化一个可变对象,序列化之后,修改对象属性值,再次序列化,只会保存上次序列化的编号(注意)
2.一个对象要进行序列化,如果该对象成员变量是引用类型的,那么这个引用类型也一定要是可序列化的,否则会报错
3.对于不想序列化的字段可以再字段类型之前加上transient关键字修饰(反序列化时会被赋予默认值)
4.同一个对象多次序列化成字节序列,这多个字节序列反序列化成的对象还是一个(使用==判断为true)(因为所有序列化保存的对象都会生成一个序列化编号,当再次序列化时回去检查此对象是否已经序列化了,如果是,那序列化只会输出上个序列化的编号)