16.11 對象序列化

對象序列化,就是把一個對象變爲二進制的數據流的一種方法,如圖16-24所示,通過對象序列化可以方便的實現對象的傳輸或存儲。
在這裏插入圖片描述
一個類的對象想被序列化,則對象所在的類必須實現java.io.Serializable接口。然而此接口並沒有提供任何的抽象方法,所以該接口是一個標識接口,只是表示一種對象可以被序列化的能力。
範例:定義序列化對象類

package com.lxh.sixteenchapter;

import java.io.Serializable;

public class Member430 implements Serializable {
   private String name;
   private int 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;
}
public Member430(String name, int age) {
	this.name = name;
	this.age = age;
}
   @Override
	public String toString() {
	
		return "姓名"+this.name+"年齡"+this.age;
	}
}

對象序列化與反序列化

對象序列化和反序列化的具體實現,依靠ObjectOutputStream與ObjectInputStream兩類完成
在這裏插入圖片描述
ObjectOutputStream類可以將對象轉爲特定格式的二進制數據輸出,ObjectInputStream類可以讀取ObjectOutputStream類輸出的二進制對象數據,並將其轉爲具體類型的對象返回。
ObjectOutputStream常用方法
在這裏插入圖片描述

ObjectInputStream常用方法

在這裏插入圖片描述
範例:實現對象序列化和反序列化操作

package com.lxh.sixteenchapter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class javaIODemo432 {
	//本次操作要將序列化的對象保存到文件中,將文件定義爲公共常量 
	private static final File SAVE_FILE=new File("E:"+File.separator+"File"+File.separator+"1.txt");
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        saveObject(new Member430("小李",18));   //對象序列化
		System.out.println(loadObject());       //反序列化
	}
	private static Object loadObject() throws FileNotFoundException, IOException, ClassNotFoundException {
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream(SAVE_FILE));
		Object obj=ois.readObject();         //反序列
		ois.close();
		return obj;
	}
	private static void saveObject(Object obj) throws FileNotFoundException, IOException {
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
		oos.writeObject(obj);  //序列化
		oos.close();
		
	}
}

執行結果
序列化:會轉換爲二進制數據
在這裏插入圖片描述
反序列化

姓名小李年齡18

transient關鍵字

transient可以使某些成員屬性不進行序列化

默認情況下,當執行對象序列化的時候,會將類中的全部屬性進行序列化操作,但有一些屬性不需要進行序列化操作(例如動態需要計算的),這個時候就可以使用transient關鍵字來完成。沒有序列化的屬性在反序列化時讀取的數據類型爲默認操作。例如name爲null。

@SuppressWarnings("serial")	// 序列化需要有一個序列化編號,該編號編譯時可以自動生成
class Member implements Serializable { 
	private transient String name ;// 此屬性不被序列化
	private int age ;
	// 其它相同代碼略 ...
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章