一、前言

  • 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。

二、关键字

2.1 Serializable

2.1.1 作用:

  • 如果你希望类能够序列化反序列化,必须实现Serializable接口,Java Serializable接口(java.io.Serializable是类如果要序列化和反序列化的话必须实现的标记接口。
  • Java对象序列化(写入)是使用ObjectOutputStream和反序列化(读取)是通过ObjectInputStream.

2.1.2 意义:

  • Serializable是一个标记接口,意味着它不包含任何方法。因此,一个类实现Serializable不需要实现任何特定的方法。一个类实现Serializable接口是告诉Java这个类是用于对象序列化的。

2.1.3 demo:

    import java.io.Serializable;
    public static class Person implements Serializable {
        public String name = null;
        public int age = 0;
        public transient double salary = 130000; //transient短暂的,表示该变量不序列化
    }

2.2 ObjectInputStream

2.2.1 作用:

  • ObjectInputStream能够让你从输入流中读取Java对象,

2.2.2 意义:

  • 读取文件中的对象时,不需每次读取一个字节。你可以把InputStream包装到ObjectInputStream中,然后就可以从中读取对象了。

2.2.3 demo:

    ObjectInputStream input = 
       new ObjectInputStream(new 
          BufferedInputStream(new (FileInputStream("object.data")));      
    
       MyClass object = (MyClass) input.readObject(); //etc.
       input.close();
  • 注:你读取的对象必须是MyClass的一个实例,并且必须事先通过ObjectOutputStream序列化到"object.data"文件中

2.3 ObjectOutputStream

2.3.1 作用:

  • ObjectOutputStream能够让你把对象写入到输出流中

2.3.2 意义:

  • 若要把对象写入(序列化)到输出流中,而不需要每次写入一个字节。你可以把OutputStream包装到ObjectOutputStream中,然后就可以把对象写入到该输出流中了

2.3.3 demo:

    OutputStream output = new FileOutputStream("data/data.bin");

    try (ObjectOutputStream oos =
        new ObjectOutputStream(output)) {      //java7_try with resource

        Person person = new Person();
        person.name = "Call me Shonan!"; 
        person.age  = 18;
        
        oos.writeObject(person);
    }
  • 注:

    • (1)、第一个FileOutputStream实例不是在try-with-resources块中创建的。这意味着,try-with-resources块将不会自动关闭这个文件输出流实例。但是,当ObjectOutputStream被关闭时,它也会关闭它写入的OutputStream实例,因此当oos关闭时,fileoutputstream实例将被关闭,
    • (2)、在你序列化和反序列化一个对象之前,该对象的类都必须实现了java.io.Serializable接口

三、附:

  • 注意

     1. static属性不参与序列化。
    
     2. 对象中的某些属性如果不想被序列化,不能使用static,而是使用transient修饰。
    
     3. 为了防止读和写的序列化ID不一致,一般指定一个固定的序列化ID。
  • 据作者得知,对象序列化本身就是一个主题,于此我们不再深入讨论有关对象序列化的更深入的细节!感兴趣的、想深入学习序列化的小伙伴可以自行深入探索!

wdt0x01
29 声望2 粉丝