java中的序列化和還原序列化學習筆記

來源:互聯網
上載者:User

標籤:tracking   invalid   set   標記   網路   string   pac   close   code   

須要序列化的Person類:

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值。 * 並且產生這個值以後。我們對類進行不論什麼改動,它讀取曾經的資料是沒有問題的。

* * 注意: * 我一個類中可能有非常多的成員變數。有些我不想進行序列化。請問該怎麼辦呢? * 使用transientkeyword聲明不須要序列化的成員變數 */public class Person implements Serializable {private static final long serialVersionUID = -2071565876962058344L;private String name;// private int age;private transient int age;//transientkeyword表示不想被序列化// 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;}@Overridepublic 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();}}


java中的序列化和還原序列化學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.