国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

談談J2SE中的序列化(三)

2019-11-18 14:54:22
字體:
來源:轉載
供稿:網友

談談J2SE中的序列化(三)
作者:Favo yang 
 favoyang@yahoo.com

何時接受默認的java序列化行為

首先要了解java默認的序列化行為,java將一切關于對象的信息都保存了下了,也就是說,有些時候那些不需要保存的也被保存了下來。一般情況下,我們僅僅需要保存邏輯數據就可以了。不需要保存的數據我們可以用要害字transient標出。

以下是一個例子:

import java.io.*;

public class Serial implements Serializable {

    int company_id;

    String company_addr;

    transient boolean company_flag;

}

    則company_flag字段將不會參與序列化與反序列化,但同時你也增加了為他初始值的責任。這也是序列化經常導致的問題之一。因為序列化相當于一個只接受數據流的public構造函數,這種對象構造方法是語言之外的。但他仍然是一種形式上的構造函數。如若你的類不能夠通過其他方面來保證初始化,則你需要額外的提供readObject方法,首先正常的反序列化,然后對transient標示的字段進行初始化。

    在不適合的時候,使用java默認的序列化行為可能會帶來速度上的影響,最糟糕的情況是,可能導致溢出。在某些數據結構的實現中,經常會充斥著各種的循環引用,而java的默認序列化行為,并不了解你的對象結構,其結果就是java試圖通過一種昂貴的“圖遍歷”來保存對象狀態。可想而知,不但慢而且可能溢出。這時候你就要提供自己的readObject,來代替默認的行為。

兼容性問題
兼容性歷來是復雜而麻煩的問題。

不要兼容性:

    首先來看看假如我們的目的是不要兼容性,應該注重哪些。不要兼容性的場合很多,比如war3每當版本升級就不能夠讀取以前的replays。

    兼容也就是版本控制,java通過一個名為UID(stream unique identifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的。假如UID不一樣的話,就無法實現反序列化了,并且將會得到InvalidClassException。

    當我們要人為的產生一個新的版本(實現并沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現:

    PRivate static final long serialVersionUID=????;

你可以編造一個版本號,但注重不要重復。這樣在反序列化的時候老版本將得到InvalidClassException,我們可以在老版本的地方捕捉這個異常,并提示用戶升級的新的版本。

當改動不大時,保持兼容性(向下兼容性的一個特例):

    有時候你的類增加了一些無關緊要的非私有方法,而邏輯字段并不改變的時候,你當然希望老版本和新版本保持兼容性,方法同樣是通過顯式的聲名UID來實現。下面我們驗證一下。

    老版本:

import java.io.*;

public class Serial implements Serializable {

    int company_id;

    String company_addr;

       public Serial1(int company_id, String company_addr) { 
           this.company_id = company_id; 
           this.company_addr = company_addr; 
    }

public String toString() {

        return "DATA: "+company_id+" "+

company_addr;

    }

}

    新版本

import java.io.*;

public class Serial implements Serializable {

    int company_id;

    String company_addr;

       public Serial1(int company_id, String company_addr) { 
           this.company_id = company_id; 
           this.company_addr = company_addr; 
    }



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 砀山县| 乌兰浩特市| 东丽区| 五大连池市| 广水市| 绥中县| 凤城市| 吉林省| 望江县| 南京市| 固镇县| 建瓯市| 巫山县| 蒙城县| 金门县| 辉南县| 宜州市| 南漳县| 雷州市| 永康市| 承德县| 丽江市| 宜黄县| 韩城市| 诸暨市| 三原县| 习水县| 龙口市| 江都市| 罗城| 灌阳县| 东乌珠穆沁旗| 江安县| 岑溪市| 哈尔滨市| 禄劝| 宝应县| 大安市| 五寨县| 五寨县| 灵台县|