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