JAVA_基礎IO流物件流(三)

BeautifulGirl230發表於2021-01-04

處理流:物件流

ObjectInputStreamOjbectOutputSteam用於儲存和讀取基本資料型別資料或物件的處理流。可以把Java中的物件寫入到資料來源中,也能把物件從資料來源中還原回來。

序列化:用ObjectOutputStream類儲存基本型別資料或物件的機制。
反序列化:用ObjectInputStream類讀取基本型別資料或物件的機制

物件序列化機制

序列化:將記憶體中的Java物件轉換成二進位制流持久地儲存在磁碟上,或通過網路將這種二進位制流傳輸到另一個網路節點(ObjectOutputStream)。

反序列化:將磁碟檔案中的二進位制流還原成記憶體中的一個Java物件(ObjectInputStream)。

要想將一個自定義的Java物件是可序列化的,需要滿足相應的要求:

  • 需要實現介面:Serializable
  • 給當前類提供全域性常量:serialVersionUID
  • 除了當前類(Person)需要實現Serializable介面,還需要保證內部所有的屬性也是可序列化的。(預設情況下,基本資料型別都是可序列化的)

注意ObjectOutputStreamObjectInputStream不能序列化statictransient修飾的成員變數。

transient修飾符: 不可序列化的。

序列化物件:

public class Person implements Serializable {
    public static final long serialVersionUID = 48542L;
    private String name;
    private int age;
    private Account account;
    ....// get、set方法
}
class Account implements Serializable {
    private static final long serialVersionUID = 68547L;
    double money;
	....// get、set方法
}

序列化操作:

/** 序列化 */
@Test
public void testObjectOutputStream() {
    ObjectOutputStream objectOutputStream = null;
    try {
        objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("object.dat")));
        objectOutputStream.writeObject(new String("世界您好!"));
        objectOutputStream.flush();

        objectOutputStream.writeObject(new Person("Tom",20));
        objectOutputStream.flush();

        objectOutputStream.writeObject(new Person("Jerry",20,new Account(20000)));
        objectOutputStream.flush();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectOutputStream != null) objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
/** 反序列化 */
@Test
public void testObjectInputStream() {
    ObjectInputStream objectInputStream = null;
    try {
        objectInputStream = new ObjectInputStream(new FileInputStream(new File("object.dat")));
        Object object = objectInputStream.readObject();
        String str = (String) object;
        Person person1 = (Person) objectInputStream.readObject();
        Person person2 = (Person) objectInputStream.readObject();
        System.out.println(str);// 世界您好!
        System.out.println(person1);// Person{name='Tom',age=20,account=null}
        System.out.println(person2);// Person{name='Jerry',age=20, account=Account{money=20000.0}}
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if (objectInputStream != null) objectInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

相關文章