什么是序列化
简言之,序列化就是把对象转换成字符串,我的理解是,对象是在内存中的,内存不能持久化,而经过序列化之后,就可以脱离内存,持久化到硬盘里,或者发送至网络。相反,通过反序列化,可以把字符串转换为对象。
在这里说成是字符串就不太严谨了,比如说我们在两台机器或者两个独立的服务中互相传送对象,我们得把这个对象转换成一种“东西”,这种东西可以通过网络来传输,到目标机器上后,经过解析,又变回了之前的对象了。如果让学过前端的同学来理解什么是序列化和反序列化,通过观察JSON.parse() 和 JSON.stringify() 的结果就可以了。
代码
import java.io.*;
import java.util.Objects;
public class T0909 {
public static class stu implements Serializable {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public stu() {
}
@Override
public String toString() {
return "stu{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
stu stu = (stu) o;
return id == stu.id && Objects.equals(name, stu.name) && Objects.equals(address, stu.address);
}
@Override
public int hashCode() {
return Objects.hash(id, name, address);
}
public stu(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println("================================生成对象stu================================");
stu stu = new stu();
stu.setId(1);
stu.setName("zunmx");
stu.setAddress("china");
System.out.println("================================将对象序列化导出成文件================================");
FileOutputStream fos = new FileOutputStream("stu.session");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu);
System.out.println("================================读入文件,反序列化成stu对象================================");
FileInputStream fis = new FileInputStream("stu.session");
ObjectInputStream ois = new ObjectInputStream(fis);
Object o = ois.readObject();
stu o1 = (stu) o;
System.out.println("================================输出反序列化之后的结果================================");
System.out.println(o1);
}
}
此时,我们可以打开stu.session,可以观察一下,这并不是字符串,但是从中我们能看到一些熟悉的文字。

T909 是class文件名
stu 是序列化的那个对象的类名
I.. ID L 这一段盲猜是id是变量名 I 表示的是Int
address 是String 而name并没有看到String
也就是说,我们不能完全看得懂 😆
最后通过反序列化,又把那个文件转化为对象了
结语
需要序列化的实体类一定要实现 Serializable, 否则序列化会失败的。

评论 0
还没有评论,来说点什么吧。