Java—序列化流与反序列化流

一、序列化&反序列化

概念:
  序列化:把Java对象转换为字节序列的过程。
  反序列化:把字节序列恢复为Java对象的过程。

序列化接口
1、当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常
2、同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:
 ① 该类的序列版本号与从流中读取的类描述符的版本号不匹配
 ② 该类包含未知数据类型
 ③ 该类没有可访问的无参数构造方法
3、Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

二、对象序列化流 ObjectOutputStream

可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。
注:只能将支持 java.io.Serializable 接口的对象写入流中

public class ObjectStream01 {
    public static void main(String[] args) throws IOException {
        // 将一个对象存储到持久化(硬盘)的设备上
        // 对象序列化
        writeObj(); 
    }

    public static void writeObj() throws IOException {
        FileOutputStream fos = new FileOutputStream("e:/objectStream.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        
        // Person类必须序列化
        oos.writeObject(new Person("wangkai", 21));
        
        // 关闭资源
        oos.close();
    }
}

person类

public class Person implements Serializable {
    //给类显示声明一个序列版本号
    private static final long serialVersionUID = 2827802788464632315L;
    
    private String name;
    private int age;
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    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;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

三、对象反序列化流 ObjectInputStream

public class ObjectStream02 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 对象反序列化
        readObj(); 
    }

    public static void readObj() throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream("e:/objectStream.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        
        Person obj = (Person) ois.readObject();
        System.out.println(obj.toString());
        
        // 关闭资源
        ois.close();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容