日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 序列化Serializable详解(附详细例子)

發布時間:2025/3/21 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 序列化Serializable详解(附详细例子) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??Java?序列化Serializable詳解(附詳細例子)?

1、什么是序列化和反序列化
Serialization(序列化)是一種將對象以一連串的字節描述的過程;反序列化deserialization是一種將這些字節重建成一個對象的過程。


2、什么情況下需要序列化?
a)當你想把的內存中的對象保存到一個文件中或者數據庫中時候;
b)當你想用套接字在網絡上傳送對象的時候;
c)當你想通過RMI傳輸對象的時候;

3、如何實現序列化

將需要序列化的類實現Serializable接口就可以了,Serializable接口中沒有任何方法,可以理解為一個標記,即表明這個類可以序列化。


4、序列化和反序列化例子

如果我們想要序列化一個對象,首先要創建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后將這些OutputStream封裝在一個ObjectOutputStream中。這時候,只需要調用writeObject()方法就可以將對象序列化,并將其發送給OutputStream記住:對象的序列化是基于字節的,不能使用Reader和Writer等基于字符的層次結構。而反序列的過程(即將一個序列還原成為一個對象),需要將一個InputStream(如FileInputstream、ByteArrayInputStream等)封裝在ObjectInputStream內,然后調用readObject()即可。

[java]?view plaincopy
  • package?com.sheepmu;??
  • import?java.io.FileInputStream;??
  • import?java.io.FileNotFoundException;??
  • import?java.io.FileOutputStream;??
  • import?java.io.IOException;??
  • import?java.io.ObjectInputStream;??
  • import?java.io.ObjectOutputStream;??
  • import?java.io.Serializable;??
  • ??
  • public?class?MyTest?implements?Serializable??
  • {??
  • ????private?static?final?long?serialVersionUID?=?1L;??
  • ????private?String?name="SheepMu";??
  • ????private?int?age=24;??
  • ????public?static?void?main(String[]?args)??
  • ????{//以下代碼實現序列化??
  • ????????try???
  • ????????{??
  • ????????????ObjectOutputStream?oos?=?new?ObjectOutputStream(new?FileOutputStream("my.out"));//輸出流保存的文件名為?my.out?;ObjectOutputStream能把Object輸出成Byte流??
  • ????????????MyTest?myTest=new?MyTest();??
  • ????????????oos.writeObject(myTest);???
  • ????????????oos.flush();??//緩沖流???
  • ????????????oos.close();?//關閉流??
  • ????????}?catch?(FileNotFoundException?e)???
  • ????????{??????????
  • ????????????e.printStackTrace();??
  • ????????}?catch?(IOException?e)???
  • ????????{??
  • ????????????e.printStackTrace();??
  • ????????}???
  • ????????fan();//調用下面的??反序列化??代碼??
  • ????}??
  • ????public?static?void?fan()//反序列的過程??
  • ????{??????
  • ?????????ObjectInputStream?oin?=?null;//局部變量必須要初始化??
  • ????????try??
  • ????????{??
  • ????????????oin?=?new?ObjectInputStream(new?FileInputStream("my.out"));??
  • ????????}?catch?(FileNotFoundException?e1)??
  • ????????{??????????
  • ????????????e1.printStackTrace();??
  • ????????}?catch?(IOException?e1)??
  • ????????{??
  • ????????????e1.printStackTrace();??
  • ????????}????????
  • ????????MyTest?mts?=?null;??
  • ????????try?{??
  • ????????????mts?=?(MyTest?)?oin.readObject();//由Object對象向下轉型為MyTest對象??
  • ????????}?catch?(ClassNotFoundException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}???????
  • ?????????System.out.println("name="+mts.name);??????
  • ?????????System.out.println("age="+mts.age);??????
  • ????}??
  • }??
  • 會在此項目的工作空間生成一個 my.out文件。序列化后的內容稍后補齊,先看反序列化后輸出如下:

    name=SheepMu
    age=24

    5、序列化ID

    序列化 ID 在 Eclipse 下提供了兩種生成策略,一個是固定的 1L,一個是隨機生成一個不重復的 long 類型數據(實際上是使用 JDK 工具生成),在這里有一個建議,如果沒有特殊需求,就是用默認的 1L 就可以,這樣可以確保代碼一致時反序列化成功。這也可能是造成序列化和反序列化失敗的原因,因為不同的序列化id之間不能進行序列化和反序列化。


    6.序列化前和序列化后的對象的關系

    是 "=="還是equal? or ?是淺復制還是深復制??

    答案:深復制,反序列化還原后的對象地址與原來的的地址不同

    序列化前后對象的地址不同了,但是內容是一樣的,而且對象中包含的引用也相同。換句話說,通過序列化操作,我們可以實現對任何可Serializable對象的”深度復制(deep copy)"——這意味著我們復制的是整個對象網,而不僅僅是基本對象及其引用。對于同一流的對象,他們的地址是相同,說明他們是同一個對象,但是與其他流的對象地址卻不相同。也就說,只要將對象序列化到單一流中,就可以恢復出與我們寫出時一樣的對象網,而且只要在同一流中,對象都是同一個。


    7.靜態變量能否序列化

    若把上面的代碼中的 age變量前加上 static ,輸出任然是

    name=SheepMu
    age=24

    但是看下面的例子:

    [java]?view plaincopy
  • package?com.sheepmu;??
  • import?java.io.FileInputStream;??
  • import?java.io.FileNotFoundException;??
  • import?java.io.FileOutputStream;??
  • import?java.io.IOException;??
  • import?java.io.ObjectInputStream;??
  • import?java.io.ObjectOutputStream;??
  • import?java.io.Serializable;??
  • public?class?MyTest?implements?Serializable??
  • {??
  • ????private?static?final?long?serialVersionUID?=?1L;??
  • ????private?String?name="SheepMu";??
  • ????private?static?int?age=24;??
  • ????public?static?void?main(String[]?args)??
  • ????{//以下代碼實現序列化??
  • ????????try???
  • ????????{??
  • ????????????ObjectOutputStream?oos?=?new?ObjectOutputStream(new?FileOutputStream("my.out"));//輸出流保存的文件名為?my.out?;ObjectOutputStream能把Object輸出成Byte流??
  • ????????????MyTest?myTest=new?MyTest();??
  • ????????????oos.writeObject(myTest);???
  • ????????????oos.flush();??//緩沖流???
  • ????????????oos.close();?//關閉流??
  • ????????}?catch?(FileNotFoundException?e)???
  • ????????{??????????
  • ????????????e.printStackTrace();??
  • ????????}?catch?(IOException?e)???
  • ????????{??
  • ????????????e.printStackTrace();??
  • ????????}???
  • ????????fan();//調用下面的??反序列化??代碼??
  • ????}??
  • ????public?static?void?fan()??
  • ????{??
  • ????????new?MyTest().name="SheepMu_1";?????//!!!!!!!!!!!!!!!!重點看這兩行?更改部分??
  • ????????age=1;????????//!!!!!!!!!!!!!!!!!!!重點看這兩行?更改部分???
  • ?????????ObjectInputStream?oin?=?null;//局部變量必須要初始化??
  • ????????try??
  • ????????{??
  • ????????????oin?=?new?ObjectInputStream(new?FileInputStream("my.out"));??
  • ????????}?catch?(FileNotFoundException?e1)??
  • ????????{??????????
  • ????????????e1.printStackTrace();??
  • ????????}?catch?(IOException?e1)??
  • ????????{??
  • ????????????e1.printStackTrace();??
  • ????????}????????
  • ????????MyTest?mts?=?null;??
  • ????????try?{??
  • ????????????mts?=?(MyTest?)?oin.readObject();//由Object對象向下轉型為MyTest對象??
  • ????????}?catch?(ClassNotFoundException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}???????
  • ?????????System.out.println("name="+mts.name);??????
  • ?????????System.out.println("age="+mts.age);??????
  • ????}??
  • }??
  • 輸出結果為:

    name=SheepMu
    age=1
    為何把最上面代碼的age變量添上static 后還是反序列化出了24呢?而新的從新對變量賦值的代碼,不是static的得到了序列化本身的值,而static的則得到的是從新附的值。原因:?序列化會忽略靜態變量,即序列化不保存靜態變量的狀態。靜態成員屬于類級別的,所以不能序列化。即 序列化的是對象的狀態不是類的狀態。這里的不能序列化的意思,是序列化信息中不包含這個靜態成員域。最上面添加了static后之所以還是輸出24是因為該值是
    JVM加載該類時分配的值。注:transient后的變量也不能序列化但是情況稍復雜,稍后開篇說。

    8、總結:

    a)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable接口;

    b)當一個對象的實例變量引用其他對象,序列化該對象時也把引用對象進行序列化;

    c) static,transient后的變量不能被序列化;


    from:?http://blog.csdn.net/sheepmu/article/details/27579895

    總結

    以上是生活随笔為你收集整理的Java 序列化Serializable详解(附详细例子)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩精品成人免费观看视频 | 美女色网站 | 欧美久久久久久久久久久久久久 | 樱花视频在线免费观看 | 久草视频国产 | 国产αv| 哪里可以免费看av | 女裸全身无奶罩内裤内衣内裤 | 日本a级c片免费看三区 | 欧美第三页 | 国产精品三区四区 | 亚洲一级二级片 | 99热日韩| 26uuu精品一区二区在线观看 | 黄色大片免费的 | 欧美久久久久 | 国产亚洲精久久久久久无码苍井空 | 大地资源二中文在线影视观看 | 粉嫩av在线播放 | 老外一级黄色片 | 日韩黄色影视 | 凹凸视频一区二区 | 99国产精品国产免费观看 | 老子午夜影院 | 寡妇高潮一级视频免费看 | 色免费视频 | 狠狠干2018 | 91挑色| 日本aⅴ在线观看 | 青青青国内视频在线观看软件 | 亚洲第一在线视频 | 国产一级片免费视频 | 成年人网站免费在线观看 | 91成人天堂久久成人 | 黄色视屏在线免费观看 | 男插女青青影院 | 久久老熟女一区二区三区 | v天堂在线 | 91久久久久久久久久久久 | 成人免费视屏 | 天天干天天看 | 黄色网页免费 | 国产熟女一区二区三区五月婷 | 国产97色在线 | 国产 | 在线观看亚洲一区 | 精品国产免费一区二区三区 | 涩涩资源站 | h成人在线 | 色香影院| 99er这里只有精品 | 91传媒在线视频 | 国产xxx视频 | 蜜桃av乱码一区二区三区 | 国产精品va无码一区二区 | 精品一区二区久久久 | 一级黄色免费毛片 | 在线免费成人 | 在线色网址 | 国产一区二区三区在线观看视频 | 久久3p | 成全影视在线观看第8季 | 丰满少妇理论片 | 黄色三极片 | 一区二区三区小说 | 欧美一级高潮片 | 欧美色v| 深夜视频一区二区三区 | 午夜影院男女 | 精品国产一区二区三 | 国产精品视频在线看 | 美丽姑娘免费观看在线观看 | 色视频在线观看免费 | 国产夫妻性爱视频 | 国产精选一区二区三区 | 播放灌醉水嫩大学生国内精品 | 久久精品国产一区二区电影 | 萌白酱喷水视频 | 深夜福利麻豆 | 亚洲一区二区在线看 | 午夜欧美激情 | 色婷婷综合五月 | 波波野结衣 | 成人免费超碰 | 麻豆日韩| www五月| 亚洲啪啪 | 欧美 唯美 清纯 偷拍 | 欧美福利网址 | 自拍偷在线精品自拍偷无码专区 | 日穴视频| 国产精品久久久久久中文字 | 极品美女啪啪 | 免费观看黄色网 | 热逼视频 | 美女扒开下面让男人捅 | 国产强被迫伦姧在线观看无码 | 手机av免费在线观看 | 午夜啪视频| 视频污在线观看 |