序列化与反序列化

半腔热情 提交于 2020-03-03 15:49:51

1. 什么是序列化 和 反序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。将内存中的对象按照指定的格式输出到输出设备上。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

2. 什么时候需要序列化

  • 把内存中的对象状态保存到一个文件中 或者 一个数据库 中。
  • 用套接字在网络上传送对象的时候。

3. 如何实现序列化

package sin_2020_03_01.Serialize;

import java.io.*;

public class TestDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        serializePerson();
        Person person = deserializePerson();
        System.out.println(person);
    }

    // 反序列化
    private static Person deserializePerson() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\test\\IO流\\person.txt"));
        Person person = (Person)ois.readObject();
        System.out.println("person 反序列化成功");
        return person;
    }
    // 序列化
    private static void serializePerson() throws IOException {
        Person person = new Person();
        person.setName("xixi");
        person.setAge(18);
        person.setSex("女");
        person.setStuId(100);

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\test\\IO流\\person.txt"));
        oos.writeObject(person);
        System.out.println("person 对象序列化成功");
        oos.close();
    }
}
class Person implements Serializable {
    private String name;
    private int age;
    private String sex;
    // transient 修饰的变量不能被序列化
    transient private int stuId;
    // static 修饰的变量,不能被序列化
    private static int count = 99;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", stuId=" + stuId +
                ", count=" + count+
                '}';
    }
}

在这里插入图片描述

序列化/反序列化 序列化 反序列化
流的方向 输出 输入
选择的流 ObjectOutputStream ObjectInputStream
构造方法 ObjectOutputStream(new FileInputStream(File file)) ObjectInputStream(new FileInputStream(File file))
调用的方法 oos.writeObject(oerson) (Person)ois.readObject()

4. 关于静态数据是否被序列化的测试

在上述例子中,其他代码不变,进行 1)将类中静态变量count 的值设置为 777,2)主函数的调用改为如下形式:

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //serializePerson();
        Person person = deserializePerson();
        System.out.println(person);
    }

运行结果为
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!