1. 程式人生 > >JAVA中序列化和反序列化中的靜態成員問題

JAVA中序列化和反序列化中的靜態成員問題

package test2;

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;

/**
 * Description: 測試物件的序列化和反序列
 */
public class TestObjSerializeAndDeserialize {

    public static void main(String[] args) throws Exception {
    	
    	// 序列化DataObject物件
        Serialize();
        
        // 反序列DataObject物件
        DataObject object = Deserialize();
        
        // 靜態成員屬於類級別的,所以不能序列化,序列化只是序列化了物件而已,
        // 這裡的不能序列化的意思,是序列化資訊中不包含這個靜態成員域,下面
        // 之所以i輸出還是2,是因為測試都在同一個機器(而且是同一個程序),因為這個jvm
        // 已經把i載入進來了,所以獲取的是載入好的i,如果是傳到另一臺機器或者關掉程式重新
        // 寫個程式讀入DataObject.txt,此時因為別的機器或新的程序是重新載入i的,所以i資訊就是初始時的資訊,即0
        System.out.println(object);
    }
    
    /**
     * MethodName: SerializePerson 
     * Description: 序列化Person物件
     * @author 
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void Serialize() throws FileNotFoundException, IOException {
    	
    	DataObject object = new DataObject();
    	object.setWord("123");
    	object.setI(2);
    	
        // 建立ObjectOutputStream物件輸出流,其中用到了檔案的描述符物件和檔案輸出流物件
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                new File("DataObject.txt")));
        
        // 將DataObject物件儲存到DataObject.txt檔案中,完成對DataObject物件的序列化操作
        oo.writeObject(object);
        
        System.out.println("Person物件序列化成功!");
        
        // 最後一定記得關閉物件描述符!!!
        oo.close();
    }

    /**
     * MethodName: DeserializePerson 
     * Description: 反序列DataObject物件
     * @author 
     * @return
     * @throws Exception
     * @throws IOException
     */
    private static DataObject Deserialize() throws Exception, IOException {
    	
    	// 建立ObjectInputStream物件輸入流,其中用到了檔案的描述符物件和檔案輸入流物件 
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                new File("DataObject.txt")));
        
        // 從DataObject.txt檔案中讀取DataObject物件,完成對DataObject物件的反序列化操作
        DataObject object = (DataObject) ois.readObject();
        System.out.println("Person物件反序列化成功!");
        
        // 最後一定記得關閉物件描述符!!!
        ois.close();
        
        return object;
    }

}
    上面這段程式大家可以直接執行。注意,這裡定義了兩個方法Serialize()和Deserialize(),分別實現了序列化和反序列化的功能,裡面的主要用到了物件輸入輸出流和檔案輸入輸出流,大家看一下程式中的註釋就可以理解。在序列化的方法中,將物件的成員變數word設定成了"123",i設定成了"2",注意這裡的i是靜態變數,那麼以通常的序列化和反序列化的理解來看,無非就是一個正過程和一個逆過程,最終經過反序列化後,輸出物件中的word和i時,大家一般都覺得應該還是"123"和"2",那麼上面程式的執行結果確實就是: