1. 程式人生 > >java中的序列化和反序列化學習筆記

java中的序列化和反序列化學習筆記

文件 track 反序列化 out val nts 鼠標 main version

須要序列化的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; } @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();
	}
}


java中的序列化和反序列化學習筆記