Head First Java 14 保存對象

保存對象

串流(Stream)

  • 串流分為連接用串流(connnection streams)和鏈接用串流(chain streams)识补,連接用串流通常來連接來源或者目的地富俄, typically a file, network socket connection, or the console. 鏈接用串流不能用來連接源或者目的地。Chain streams cannot connect to a source or destination and must be chained to a connection (or other) stream.

File

  • File對象代表文件或者目錄的路徑镊折,但不代表文件或者目錄本身
//創(chuàng)建代表已有文件的File對象
File f = new File("Mycode.txt");
//創(chuàng)建新的目錄
File dir = new File("MyDocuments");
dir.mkdir();
//列出目錄下的內容
if(dir.isDirectory()){
    String[] dirContents = dir.list();}
//取得絕對路徑
System.out.println(dir.getAbsolutePath());
//刪除文件或目錄
boolean isDeleted = f.delete();

序列化(Serialization)

  • 對象有狀態(tài)行為兩種屬性猜极,行為存儲在類中,狀態(tài)存儲在每個個別的對象椭符,需要存儲對象狀態(tài)的時候使用序列化(Serialization)
//ObjectOutputStream與FileOutputStream都為OutputStream的子類,OutputStream為一個抽象類耻姥。
//左邊為對象字節(jié)流销钝,右邊為文件字節(jié)流,write向右琐簇,read向左
//characterOne必須是一個可被序列化的對象曙搬,需要實現Serializable接口才可以
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("MyGame.ser"));
oos.writeObject(characterOne);
oos.close();
  • 當對象被序列化時,被該對象引用的實例化變量也被序列化鸽嫂,并且所有被引用的對象也都會被序列化

  • 序列化版圖中如果有任何一個變量沒有序列化成功,則整個序列化都失敗征讲。例如序列化Pond對象時据某,如果Duck類沒有實現Serializable接口,則序列化失敗

  • 如果某實例變量不能或不應該被序列化時诗箍,就把它標記為transient 癣籽,則序列化過程可以跳過這個實例變量。當序列化還原的時候,被transient的實例變量會以值為null的對象引用或0筷狼,false等默認primitive主數據類型返回

    public class Pond{
        public String name;
        public Duck duck = new Duck();
    }

    public class Pond{
        public String name;
        public transient Duck duck = new Duck();
    }
  • 如果一個對象序列化后被還原瓶籽,且他的父類是不可序列化的,則父類的構造函數會跟著創(chuàng)建新的對象時一起執(zhí)行

  • 如果兩個對象都有引用實例變量指向相同的對象埂材,那么他們在被序列化的時候只有一個引用對象會被存儲塑顺,另一個會復原成指向該引用

  • 靜態(tài)變量不會被序列化,因為static代表每個類一個而不是每個變量一個俏险,所以對象被還原時严拒,靜態(tài)變量會維持類中原本的樣子,而不是存儲時的樣子

  • 如果你的類可能在產生序列化對象之后繼續(xù)演變竖独,則會有與序列化時不同的serialVersionUID裤唠,那么在解序列化時則會失敗。所以如果你的類可能在產生序列化對象之后繼續(xù)演變莹痢,你可以手工獲得版本ID种蘸,然后將其拷貝到類上,但你必須確定你的改變不會對解序列化造成傷害

解序列化(Deserialization)

//ObjectInputStream與FileInputStream都為InputStream的子類竞膳,InputStream為一個抽象類航瞭。
//左邊為對象字節(jié)流,右邊為文件字節(jié)流顶猜,write向右沧奴,read向左
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("MyGame.ser"));
Object one = ois.readObject();
Object two = ois.readObject();
GameCharacter elf = (GameCharacter) one;
GameCharacter troll = (GameCharacter) two;
ois.close();
  • 解序列化時Java虛擬機會嘗試尋找和加載對象的類,如果找不到或無法加載該類长窄,則會拋出異常滔吠。對于通過網絡傳送序列化對象來說,有一種機制可以讓類使用URL來指定自己的位置挠日,讓你可以把序列化對象當作參數的一部分來傳送疮绷,如果接受此調用的Java虛擬機沒有此類,則它可以自動使用URL來取回并加載該類

  • 解序列化后新的對象會被配置在堆上嚣潜,但構造函數不會執(zhí)行冬骚,因為這樣會把對象的狀態(tài)抹去變成全新的狀態(tài)。如果對象在繼承樹上有個不可序列化的祖先類懂算,則該不可序列化類以及在它之上的類(就算可序列化也一樣)構造函數都會執(zhí)行只冻,且一經啟動,無法停止

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末计技,一起剝皮案震驚了整個濱河市喜德,隨后出現的幾起案子,更是在濱河造成了極大的恐慌垮媒,老刑警劉巖舍悯,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航棱,死亡現場離奇詭異,居然都是意外死亡萌衬,警方通過查閱死者的電腦和手機饮醇,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秕豫,“玉大人朴艰,你說我怎么就攤上這事∧俚伲” “怎么了呵晚?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沫屡。 經常有香客問我饵隙,道長,這世上最難降的妖魔是什么沮脖? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任金矛,我火速辦了婚禮,結果婚禮上勺届,老公的妹妹穿的比我還像新娘驶俊。我一直安慰自己,他們只是感情好免姿,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布饼酿。 她就那樣靜靜地躺著,像睡著了一般胚膊。 火紅的嫁衣襯著肌膚如雪故俐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天紊婉,我揣著相機與錄音药版,去河邊找鬼。 笑死喻犁,一個胖子當著我的面吹牛槽片,可吹牛的內容都是我干的。 我是一名探鬼主播肢础,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼还栓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了传轰?” 一聲冷哼從身側響起蝙云,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路召,沒想到半個月后勃刨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡股淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年身隐,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唯灵。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贾铝,死狀恐怖,靈堂內的尸體忽然破棺而出埠帕,到底是詐尸還是另有隱情垢揩,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布敛瓷,位于F島的核電站叁巨,受9級特大地震影響,放射性物質發(fā)生泄漏呐籽。R本人自食惡果不足惜锋勺,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狡蝶。 院中可真熱鬧庶橱,春花似錦、人聲如沸贪惹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏瞬。三九已至枫绅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丝格,已是汗流浹背撑瞧。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留显蝌,地道東北人预伺。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像曼尊,于是被迫代替她去往敵國和親酬诀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容