1. 程式人生 > >Java Serializable序列號和反序列化

Java Serializable序列號和反序列化

當一個類實現了Serializable介面(該介面僅為標記介面,不包含任何方法定義),表示該類可以序列化.序列化的目的是將一個實現了Serializable介面的物件轉換成一個位元組序列,可以 把該位元組序列儲存起來(例如:儲存在一個檔案裡),以後可以隨時將該位元組序列恢復為原來的物件。甚至可以將該位元組序列放到其他計算機上或者通過網路傳輸到其他計算機上恢復,只要該計 算機平臺存在相應的類就可以正常恢復為原來的物件。
//序列化一個物件(儲存到一個檔案)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“person”));
oos.writeObject(“Hello world\n”);
oos.writeObject(new Person(“BOB”, “123456”));
oos.close();

//反序列化,將該物件恢復(儲存到一個檔案)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“person.out”));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);

這個我的個人理解是ByteArrayOutputStream是用來快取資料的(資料寫入的目標(output stream原義)),向它的內部緩衝區寫入資料,緩衝區自動增長,當寫入完成時可以從中提取資料。由於這個原因,ByteArrayOutputStream常用於儲存資料以用於一次寫入
//序列化一個物件(儲存到位元組陣列)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos);
oos2.writeObject(“Save Obj Data:\n”);
oos2.writeObject(new Person(“John”, “654321”));
oos2.close();

當需要這個快取資料的時候取出來使用
//反序列化,將該物件恢復(儲存到位元組陣列)
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
s = (String)ois2.readObject();
p = (Person)ois2.readObject();
System.out.println(s + p);

下面測試一下

public class Persion implements Serializable {
    public
String name; public String password; public Persion(String name,String password){ this.password = password; this.name = name; } public static void save1(){ try{ ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("persion")); outputStream.writeObject("hello world/n"); outputStream.writeObject(new Persion("bob","12345")); outputStream.close(); }catch (Exception e){ e.printStackTrace(); }finally { } } public static void read1(){ try { ObjectInputStream input = new ObjectInputStream(new FileInputStream("persion")); String str = (String)input.readObject(); System.out.println(str); Persion persion = (Persion)input.readObject(); System.out.println(persion.name+" "+persion.password); }catch (Exception e){ e.printStackTrace(); }finally { } } public static void main(String[] args) { save1(); read1(); } }