国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

Java自定義序列化行為解析

發布時間:2011-5-1 20:00    發布者:1046235000
正常情況下,一個類實現java序列化很簡單,只需要implements Serializable接口即可,之后該類在跨jvm 的傳輸過程中會遵照默認java序列化規則序列化和反序列化;不同jvm 版本之間序列化方式稍有不同,但基本上都是兼容的。在某些特殊情況下,可能需要自定義序列化和反序列化的行為,看下面例子:
    Java代碼
    class AbstractSerializeDemo {
    private int x , y;
    public void init(int x , int y) {
    this.x = x;
    this.y = y;
    }
    public int getX () {
    return x;
    }
    public int getY () {
    return y;
    }
    public void printXY () {
    System.out.println("x:" + x + " ;y :" + y );
    }
    }
    public class SerializeDemo extends AbstractSerializeDemo implements
    Serializable {
    private int z ;
    public SerializeDemo() {
    super.init(10, 50 );
    z = 100 ;
    }
    public void printZ() {
    super.printXY ();
    System.out.println("z:" + z );
    }
    public static void main (String[] args ) throws IOException , ClassNotFoundException
    {
    ByteArrayOutputStream bos = new ByteArrayOutputStream ();
    ObjectOutputStream out = new ObjectOutputStream (bos );
    SerializeDemo sd = new SerializeDemo();
    sd.printZ ();
    out.writeObject (sd);
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream
    (bos.toByteArray ()));
    SerializeDemo sd2 = (SerializeDemo ) in.readObject();
    sd2.printZ();
    }
    }

   這段程序表示了一個可序列化的類繼承自一個非序列化的有狀態超類,期望的結果是,子類序列化以后傳輸并反序列化回來,原先的值域包括超類的值域都保持不變。
    但是輸出是:
    Java代碼
    x :10;y :50
    z :100
    x :0 ;y :0
    z :100 結果和期望不符,子類的值域保留下來了,但是超類的值域丟失了,這對jvm 來說是正常的,因為超類不可序列化;為了解決這個問題,只能自定義序列化行為,具體做法是在SerializeDemo里加入以下代碼:
    Java代碼
    private void writeObject(ObjectOutputStream os ) throws IOException
    {
    os.defaultWriteObject ();//java對象序列化默認操作
    os.writeInt (getX());
    os.writeInt (getY());
    }
    private void readObject (ObjectInputStream is) throws IOException
    ,ClassNotFoundException {
    is.defaultReadObject();//java對象反序列化默認操作
    int x=is.readInt();
    int y=is.readInt();
    super.init(x ,y );
    } writeObject 和readObject方法為JVM 會在序列化和反序列化java對象時
    會分別調用的兩個方法,修飾符都是private ,沒錯。我們在序列化的默認動作之后將超類里的兩個值域x 和y 也寫入object流;與之對應在反序列化的默認操作之后讀入x 和y 兩個值,然后調用超類的初始化方法。
    再次執行程序之后的輸出為:
    Java代碼
    x :10;y :50
    z :100
    x :10;y :50
    z :100 另外還有兩個自定義序列化方法writeReplace和readResolve ,分別用來在序列化之前替換序列化對象和在反序列化之后的對返回對象的處理。一般可以用來避免singleTon 對象跨jvm 序列化和反序列化時產生多個對象實例,事實上singleTon 的對象一旦可序列化,它就不能保證singleTon 了。JVM 的Enum實現里就是重寫了readResolve 方法,由JVM 保證Enum的值都是singleTon 的,所以建議多使用Enum代替使用writeReplace和readResolve 方法。
    Java代碼
    private Object readResolve()
    {
    return INSTANCE ;
    }
    private Object writeReplace (){
    return INSTANCE ;
    }
    注:writeReplace調用在writeObject 前;readResolve 調用在readObject
    之后。
本文地址:http://www.qingdxww.cn/thread-64041-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 这里只有精品在线播放 | 老司机在线精品视频 | 国产高清av在线播放 | 4虎永免费最新永久免费地址 | 欧美日韩国产高清一区二区三区 | 成品人视频w免费观看w | 亚洲欧美视频在线 | 免费国产一级特黄久久 | 91手机看片国产永久免费 | 国产一区二区在免费观看 | 久色网 | 精品视频h | 青青草国产免费国产是公开 | 天天爽夜夜春 | www.色在线观看 | 国产羞羞的视频在线观看免费 | 九九国产精品视频 | 国产精品三级在线 | se色综合视频 | 禁网站在线观看免费视频 | 亚洲国产高清在线精品一区 | 青青青操 | 一区二区三区日韩免费播放 | 亚洲综合免费视频 | 久久精品一区二区三区资源网 | 激情文学在线视频 | 天天操天天插天天干 | 麻豆精选传媒4区2021 | 久久99热66这里只有精品一 | 成人免费在线视频网站 | 欧美成人aa久久狼窝动画 | 中文字幕一区二区在线播放 | 色人阁亚洲 | 黄色午夜视频 | 国产福利小视频高清在线观看 | 成人性生免费视频 | 日本h在线精品免费观看 | 青青国产| 九九免费高清在线观看视频 | 日本视频在线观看免费 | 自拍国内|