1. 程式人生 > >序列化(寫對象)與反序列化(讀對象)

序列化(寫對象)與反序列化(讀對象)

獲得 close input main lee 應該 strong day ron

序列化(寫對象)與反序列化(讀對象)

1、java.io.ObjectOutputStream extends OutputStream

對象的序列化流,把對象以流的方式寫入文件

構造方法

構造方法 作用
ObjectOutStream(OutputStream out) 創建使用指定OutputStream的 ObjectOutputStream對象

參數:

OutputStream out :字節輸出流

特有的一個成員方法

方法 作用
void writeObject(Object obj) 將指定的對象寫入到ObjectOutputStream

使用步驟

  • 創建ObjectOutputStream對象,構造方法中傳遞字節輸出流對象
  • 使用ObjectOutputStream對象的writeObject方法,將指定對象寫入ObjectOutStream
  • close方法釋放資源
package cn.zhuobo.day15.aboutObjectOutputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo01ObjectOutputStream {
    public static void main(String[] args) throws IOException {
        Person p1 = new Person("豬八戒", 360);
        writeObject(p1);
    }

    private static void writeObject(Person p) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day15-code/writeObject.txt"));
        oos.writeObject(p);
        oos.close();
    }
}

但是要註意的是:要要序列化或者反序列化的對象應該是實現了一個java.io.Serializable接口的

Serializable接口:是一個標記類,實現該接口的類會獲得一個標記,用來標記對象可以序列化或者反序列化。這個接口內部其實什麽也沒有,就僅僅是標記作用的標記類。沒有實現該接口的類的對象要序列化就會拋出 NotSerializableException

public class Person implements Serializable {
    // body
}

2、java.io.ObjectInputStream extends InputStream

對象的反序列化流,把文件保存的對象以流的方式讀取出來

構造方法

構造方法 作用
ObjectInputStream(InputStream in) 創建一個從指定的 InputStream對象中讀取的ObjectInputStream

參數

InputStream in : 字節輸入流

特有的成員方法

方法 作用
Object readObject() 從ObjectInputStream中讀取對象

使用步驟

  • 創建一個ObjectInputStream對象,參數傳遞字節輸入流對象
  • 使用ObjectInputStream對象的readObject方法,讀取保存對象的文件
  • 使用close方法釋放資源
  • 使用讀取的對象
package cn.zhuobo.day15.aboutObjectInputStream;

import cn.zhuobo.day15.aboutObjectOutputStream.Person;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Demo01ObjectInputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day15-code/writeObject.txt"));

        Object o = ois.readObject();
        ois.close();

       // System.out.println(o.toString());
        Person p = (Person)o;
        System.out.println(p);
    }
}

要註意的是

反序列化的前期:類必須實現了Serializable接口,其次是存在類對應的class文件

readObject方法已經聲明了拋出ClassNotFoundException,因此這個異常也要處理,或者繼續聲明throws或者try catch

序列化(寫對象)與反序列化(讀對象)