java中的序列化

1)概念: 序列化:把java對象轉換爲字節序列的過程。 反序列化:把字節序列恢復爲Java對象的過程。java

2)做用:
	數據的持久化。
	進行遠程通訊(即:在網絡上傳送對象的字節序列)
	
	
3)實現:要序列化的類必須實現Serializable接口:
	
	1)若類實現了Serializable接口:
	
		使用ObjectOutputStream的writeObject(Object obj)方法來實現序列化,使用ObjectInputStream的readObject()方法來實現反序列化。
		
		舉例:
			// 序列化
			Person person1 = new Person("jack", 17);
			Person person2 = new Person("jack", 18);				
			File file = new File("D:\\test\\Person.txt");
			FileOutputStream fos = new FileOutputStream(file);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(person1); 	// 注:若Person未實現Serializable接口,則writeObject(Object obj)方法會報java.io.NotSerializableException的錯誤。
			oos.writeObject(person2);
			oos.close();
			fos.close();

			// 反序列化		
			FileInputStream fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			Person person11 = (Person) ois.readObject();
			Person person22 = (Person) ois.readObject();
			ois.close();
			fis.close();
			
	
	2)若類實現了Serializable接口,且定義了writeObject方法和readObject方法:
	
		使用類本身定義的writeObject(java.io.ObjectOutputStream s)方法 和 readObject(java.io.ObjectInputStream s)方法 來實現序列化和反序列化。
		
		舉例:ArrayList類
	
	3)若類實現了Externalizable接口:
	
		使用類實現的writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in) 方法來實現序列化和反序列化。
		
		說明:Externalizable接口繼承了Serializable接口,Externalizable接口定義了兩個方法:writeExternal(ObjectOutput out) 和 readExternal(ObjectInput in)
	
	
	
4)注意:
	1)反序列化的順序必定要和序列化的順序相同。
	
	2)類中被transient關鍵字修飾的屬性不會被序列化。
		說明:若類實現了Externalizable接口,那麼transient修飾的屬性是否能夠序列化取決於該類自定義的writeExternal和readExternal方法的實現。
		
	3)類中的靜態屬性不會被實例化。
	
	4)類中若是未顯式聲明靜態屬性serialVersionUID,那麼在序列化時將基於該類的各個方面計算該類的默認serialVersionUID值。儘管如此,咱們仍是強烈建議全部可序列化的類都顯式聲明serialVersionUID 值,且serialVersionUID建議聲明爲private的。
		說明:
			1>計算默認的serialVersionUID對類的詳細信息具備較高的敏感性,根據編譯器實現的不一樣可能千差萬別,這樣在反序列化過程當中可能會致使意外的InvalidClassException。
			2>數組類不能聲明一個明確的serialVersionUID,所以它們老是具備默認的計算值,可是數組類沒有匹配 serialVersionUID 值的要求。
相關文章
相關標籤/搜索