Loading... # 什么是序列化 简言之,序列化就是把对象转换成字符串,我的理解是,对象是在内存中的,内存不能持久化,而经过序列化之后,就可以脱离内存,持久化到硬盘里,或者发送至网络。相反,通过反序列化,可以把字符串转换为对象。 在这里说成是字符串就不太严谨了,比如说我们在两台机器或者两个独立的服务中互相传送对象,我们得把这个对象转换成一种“东西”,这种东西可以通过网络来传输,到目标机器上后,经过解析,又变回了之前的对象了。如果让学过前端的同学来理解什么是序列化和反序列化,通过观察JSON.parse() 和 JSON.stringify() 的结果就可以了。 # 代码 ```java 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,可以观察一下,这并不是字符串,但是从中我们能看到一些熟悉的文字。 ![image.png](https://www.zunmx.top/usr/uploads/2022/09/4137606824.png) T909 是class文件名 stu 是序列化的那个对象的类名 I.. ID L 这一段盲猜是id是变量名 I 表示的是Int address 是String 而name并没有看到String 也就是说,我们不能完全看得懂 😆 最后通过反序列化,又把那个文件转化为对象了 # 结语 需要序列化的实体类一定要实现 `Serializable`, 否则序列化会失败的。 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏