序列化流:把物件按照流一樣的方式存入文本檔案或者在網路中傳輸,物件 -- 流資料(ObjectOutputStream)
* 反序列化流:把文本檔案中的流物件資料或者網路中的流物件資料還原成物件,流資料 -- 物件(ObjectInputStream)
package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化例外 * * 類通過實作 java.io.Serializable 介面以啟用其序列化功能,未實作此介面的類將無法使其任何狀態序列化或反序列化, * 該介面居然沒有任何方法,類似于這種沒有方法的介面被稱為標記介面, * * java.io.InvalidClassException: * cn.itcast_07.Person; local class incompatible: * stream classdesc serialVersionUID = -2071565876962058344, * local class serialVersionUID = -8345153069362641443 * * 為什么會有問題呢? * Person類實作了序列化介面,那么它本身也應該有一個標記值, * 這個標記值假設是100, * 開始的時候: * Person.class -- id=100 * wirte資料: oos.txt -- id=100 * read資料: oos.txt -- id=100 * * 現在: * Person.class -- id=200 * wirte資料: oos.txt -- id=100 * read資料: oos.txt -- id=100 * 我們在實際開發中,可能還需要使用以前寫過的資料,不能重新寫入,怎么辦呢? * 回想一下原因是因為它們的id值不匹配, * 每次修改java檔案的內容的時候,class檔案的id值都會發生改變, * 而讀取檔案的時候,會和class檔案中的id值進行匹配,所以,就會出問題, * 但是呢,如果我有辦法,讓這個id值在java檔案中是一個固定的值,這樣,你修改檔案的時候,這個id值還會發生改變嗎? * 不會,現在的關鍵是我如何能夠知道這個id值如何表示的呢? * 不用擔心,你不用記住,也沒關系,點擊滑鼠即可, * 你難道沒有看到黃色警告線嗎? * * 我們要知道的是: * 看到類實作了序列化介面的時候,要想解決黃色警告線問題,就可以自動產生一個序列化id值, * 而且產生這個值以后,我們對類進行任何改動,它讀取以前的資料是沒有問題的, * * 注意: * 我一個類中可能有很多的成員變數,有些我不想進行序列化,請問該怎么辦呢? * 使用transient關鍵字宣告不需要序列化的成員變數 */ public class Person implements Serializable { private static final long serialVersionUID = -2071565876962058344L; private String name; // private int age; private transient int age; // 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 + "]"; } }
package cn.itcast_07; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /* * 序列化流:把物件按照流一樣的方式存入文本檔案或者在網路中傳輸,物件 -- 流資料(ObjectOutputStream) * 反序列化流:把文本檔案中的流物件資料或者網路中的流物件資料還原成物件,流資料 -- 物件(ObjectInputStream) */ public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { // 由于我們要對物件進行序列化,所以我們先自定義一個類 // 序列化資料其實就是把物件寫到文本檔案 // write(); read(); } private static void read() throws IOException, ClassNotFoundException { // 創建反序列化物件 ObjectInputStream ois = new ObjectInputStream(new FileInputStream( "oos.txt")); // 還原物件 Object obj = ois.readObject(); // 釋放資源 ois.close(); // 輸出物件 System.out.println(obj); } private static void write() throws IOException { // 創建序列化流物件 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( "oos.txt")); // 創建物件 Person p = new Person("林青霞", 27); // public final void writeObject(Object obj) oos.writeObject(p); // 釋放資源 oos.close(); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455518.html
標籤:其他
