Java 重新理解Serializable

  • Java 序列化:指的是將Java對象通過流的方式寫到磁盤上將其保存起來尿这。

最初是為了支持RMI(Remote Method Invocation)遠(yuǎn)程方法調(diào)用,它可以實現(xiàn)其它計算機訪問該對象就像自己的計算機訪問該對象那么的簡單碟摆,還有就是JavaBean這種對象在設(shè)計階段啟動時的狀態(tài)配置叨橱。一般將對象或者異常輸出到文件作持久化或者通過網(wǎng)絡(luò)傳輸?shù)狡渌嬎銠C進行處理。

  • Java反序列化:序列化的逆過程嘉裤,將序列化到文件中的內(nèi)容反序列化成對象。

程序?qū)崿F(xiàn)

class Student implements Serializable {
    public static int week;
    private String name;
    private int age;
    // 使用transient關(guān)鍵字后不會序列化該字段
    private transient String homeWork;

    public Student(String name, int age, String homeWork, int weekday) {
        this.name = name;
        this.age = age;
        this.homeWork = homeWork;
        week = weekday;
    }

    @Override
    public String toString() {
        return "Student [" + "name=" + name + ", "
                + "age=" + age + ", homeWork=" + homeWork + ", "
                + "static week=" + week + "]";
    }

}

private static void serializeStudent() throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/student"));
    oos.writeObject(new Student("小明", 10, "做數(shù)學(xué)題", 2));
    oos.close();
}

private static Student deserializeStudent() throws IOException, ClassNotFoundException {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/student"));
    Student stu = (Student) ois.readObject();
    ois.close();
    return stu;
}

第一次測試

public static void main(String[] args) throws IOException, ClassNotFoundException {
    serializeStudent();
    System.out.println(deserializeStudent());//Student [name=小明, age=10, homeWork=null, static week=2]
}

嗯。仇让。看似很完美丧叽,先別急,接著第二次測試假瞬。迂尝。

public static void main(String[] args) throws IOException, ClassNotFoundException {
    //serializeStudent();
    //因為之前已經(jīng)序列化并且保存到磁盤了,現(xiàn)在直接進行反序列化操作
    System.out.println(deserializeStudent());//Student [name=小明, age=10, homeWork=null, static week=0]
}

看到這里琴许,有沒有發(fā)覺程序結(jié)果發(fā)生了小小的變化溉躲?沒錯那就是week這個靜態(tài)變量。說到這里可能有人就有疑問了锻梳,那么之前的那個week怎么就沒錯呢?這個其實是因為static變量在經(jīng)類加載器加載過后會永駐內(nèi)存邦鲫,事實上不管你是否進行序列化和反序列化它都是那個值,也就是2庆捺。但第二次測試后,Jvm重新運行當(dāng)然要重新加載Student了捉腥,因為序列化并不會對static起作用你画,所以week這個變量并沒有保存,那么week自然就是默認(rèn)值坏匪,也就是0,

防止序列化和反序列化敦迄,當(dāng)調(diào)用writeObject(Object obj)方法時會檢查該對象是否具有writeObject()和readObject()方法如果有凭迹,則通過反射進行調(diào)用。

//防止序列化
private void writeObject(ObjectOutputStream os )throws IOException {
    throw new RuntimeException("");
}
//防止反序列化
private void readObject(ObjectInputStream in) throws IOException {
    throw new RuntimeException();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脾猛,一起剝皮案震驚了整個濱河市鱼鸠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漆弄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哥蔚,居然都是意外死亡蛛蒙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門深夯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咕晋,你說我怎么就攤上這事∽揖粒” “怎么了质蕉?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禁悠。 經(jīng)常有香客問我,道長绷蹲,這世上最難降的妖魔是什么顾孽? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮拦英,結(jié)果婚禮上测秸,老公的妹妹穿的比我還像新娘。我一直安慰自己霎冯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布慷荔。 她就那樣靜靜地躺著缠俺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磷雇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天唯笙,我揣著相機與錄音,去河邊找鬼。 笑死七嫌,一個胖子當(dāng)著我的面吹牛呢堰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枉疼,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惹资!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起褪测,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤潦刃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后分扎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡畏吓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年菲饼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏悦。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡肛根,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漏策,到底是詐尸還是另有隱情臼氨,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布褂乍,位于F島的核電站,受9級特大地震影響逃片,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜只酥,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一裂允、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绝编,春花似錦、人聲如沸十饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谬运。三九已至,卻和暖如春梆暖,著一層夾襖步出監(jiān)牢的瞬間掂骏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工弟灼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人田绑。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓掩驱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翎猛。 傳聞我的和親對象是個殘疾皇子囱持,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • JAVA序列化機制的深入研究 對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整...
    時待吾閱讀 10,872評論 0 24
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法笑诅,內(nèi)部類的語法疮鲫,繼承相關(guān)的語法,異常的語法棚点,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,116評論 0 62
  • 以下數(shù)據(jù)為當(dāng)前數(shù)據(jù)與去年同期對比砌梆。 昨日UV 48151贬循,截止當(dāng)前日均UV 37357,本月目標(biāo)日均UV 2485...
    Time_1943閱讀 281評論 0 0
  • 十二月的雪是沉寂的羽片 飄落在夢的遼遠(yuǎn) 你用手指告訴我一個蒼白的名字 凍結(jié)住血液 所以我回頭的時候你看不見 孤獨的...
    夢深深處閱讀 239評論 0 3