序列化技术和反序列化技术
一、序列化
序列化:将对象存储到文件的过程。
举个例子: 今天我编写了图书类,因为任务量比较大,需要存很多书。存进去后,如果当时程序关闭,那么我存的书也就会丢失、消失。序列化,就是把我存进的那些 书,保存成文件。即使程序关闭,在我下一次打开程序,通过反序列化可以将那么数据读取出来。 保证了数据的安全,不会被丢失。
反序列化:将文件数据变成对象的过程。
一点关于序列化技术的看法:
自97年序列化技术出现之后,受到广大开发人员、企业的喜爱。在2018年之前,大量的程序员在使用这项技术,包括Java 官方后来推出的一些功能里面也都有它的身影,因为太方便了。
但是尴尬的事情是,18年后,Java官方发布了一个公告,大概意思就是:
“兄弟们呐,这个东西咱们别用了。为啥不让用呢?从97年推出这个东西之后,后来程序员在写东西的时候,也包括官方在调试bug的时候。发现,有至少1/3的bug,是因为使用了序列化和反序列化产生的。产生一系列化安全问题,包括一系列其他问题,很多的bug。我会在近几个版本,把序列化和反序列化从JDK中拿掉。”
因为它简单、太好用了,收到广泛的使用,但是后来出现bug导致很尴尬。就好比,房子都盖好了,住了两年,结果你说别住了,砖头有问题容易塌。。。。。
---- 不过,个人看来,在没有新的可替代技术出现的话,序列化和反序列化暂时不会退出Java 的舞台。
下面是序列化的简单代码:
package 序列化;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @program: IO 流
* @description: 序列化
* @author: 白嫖怪AE
* @create: 2021-11-21 11:47
**/
public class Demo1 {
public static void main(String[] args) throws IOException {
//序列化
Book b1 = new Book("JavaScript百炼成仙","一本关于修仙的学习资料.");
// E盘 1 文件夹下,建立一个 文档保持数据
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\1\\序列化后Book.txt"));
// 写入 b1 图书
oos.writeObject(b1);
oos.close();
}
//创建一个静态 图书类
// 必须加一个 序列化标记接口,这个类才能被序列化
// 需要注意,Book类 下,如果有其他的 类,这个类也需要被 序列化接口标识
static class Book implements Serializable {
private String name;
private String info;
public Book() {
}
public Book(String name, String info) {
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
}
二、反序列化
序列化:将对象存储到文件的过程。
举个例子: 今天我编写了图书类,因为任务量比较大,需要存很多书。存进去后,如果当时程序关闭,那么我存的书也就会丢失、消失。序列化,就是把我存进的那些 书,保存成文件。即使程序关闭,在我下一次打开程序,通过反序列化可以将那么数据读取出来。 保证了数据的安全,不会被丢失。
反序列化:将文件数据变成对象的过程。
// 反序列化
package 序列化和反序列化;
import java.io.*;
/**
* @program: IO 流
* @description: 序列化
* @author: 白嫖怪AE
* @create: 2021-11-21 11:47
**/
public class Demo1 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
Book b1 = new Book("JavaScript百炼成仙","一本关于修仙的学习资料.");
// E盘 1 文件夹下,建立一个 文档保持数据
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\1\\序列化后Book.txt"));
// 写入 b1 图书
oos.writeObject(b1);
oos.close();
//反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\1\\序列化后Book.txt"));
// ------------
// Object o = ois.readObject();
// System.out.println(o);
// System.out.println("反序列化完成");
//
// 或者 --------强转book类-----
Book book =(Book) ois.readObject();
System.out.println(book.name+":"+book.info);
System.out.println("反序列化完成");
}
//创建一个静态 图书类
// 必须加一个 序列化标记接口,这个类才能被序列化
// 需要注意,Book类 下,如果有其他的 类,这个类也需要被 序列化接口标识
static class Book implements Serializable {
private String name;
private String info;
public Book() {
}
public Book(String name, String info) {
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
}
强转 book类,显示内容