Java 的序列化和反序列化

什么是序列化

简言之,序列化就是把对象转换成字符串,我的理解是,对象是在内存中的,内存不能持久化,而经过序列化之后,就可以脱离内存,持久化到硬盘里,或者发送至网络。相反,通过反序列化,可以把字符串转换为对象。
在这里说成是字符串就不太严谨了,比如说我们在两台机器或者两个独立的服务中互相传送对象,我们得把这个对象转换成一种“东西”,这种东西可以通过网络来传输,到目标机器上后,经过解析,又变回了之前的对象了。如果让学过前端的同学来理解什么是序列化和反序列化,通过观察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,可以观察一下,这并不是字符串,但是从中我们能看到一些熟悉的文字。
image.png
T909 是class文件名
stu 是序列化的那个对象的类名
I.. ID L 这一段盲猜是id是变量名 I 表示的是Int
address 是String 而name并没有看到String
也就是说,我们不能完全看得懂 😆

最后通过反序列化,又把那个文件转化为对象了

结语

需要序列化的实体类一定要实现 Serializable, 否则序列化会失败的。

评论 0

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

提交后需要审核才会公开。