成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么使用Serializable(序列化)

開發 后端
實現了Serializable接口的對象,可將它們轉換成一系列字節,并可在以后完全恢復回原來的樣子。這一過程亦可通過網絡進行。這意味著序列化機制能自動補償操作系統間的差異。本文介紹了使用序列化的原因,一起來看。

經常看到有些類調用了Serializable接口,而有些類又沒有調用Serializable接口。那么什么情況下要調用Serializable接口。

首先來了解一下Serializable。(類通過實現 java.io.Serializable 接口以啟用其序列化功能。未實現此接口的類將無法使其任何狀態序列化或反序列化。序列化接口Serializable沒有方法或字段,僅用于標識可序列化的語義)

實現了Serializable接口的對象,可將它們轉換成一系列字節,并可在以后完全恢復回原來的樣子。這一過程亦可通過網絡進行。這意味著序列化機制能自動補償操作系統間的差異。換句話說,可以先在Windows機器上創建一個對象,對其序列化,然后通過網絡發給一臺Unix機器,然后在那里準確無誤地重新“裝配”。不必關心數據在不同機器上如何表示,也不必關心字節的順序或者其他任何細節。

serialization主要用來支持2種主要的特性:

1、RMI(Remote method invocation)。

RMI允許象在本機上一樣操作遠程機器上的對象。當發送消息給遠程對象和調用遠程方法時,就需要用到serializaiton機制來發送參數和接收返回值。

2、保存信息。

在某個時候把狀態信息保存起來,以便以后某個時候能恢復這些狀態信息。

Hibernaet和EJB中的實體Bean就用到了上面兩個特性。

另外:保存的時候不僅能保存對象的副本,而且還會把對象里面所引用的對象也保存起來,以此類推。就像在編譯某個類一樣,會涉及到所用到的所有類。但是所引用的對象也必須是可序列化的,不然會拋NotSerializableException異常。

下面來寫個例子:(A和B類都是可序列化的,WriteObj:將A序列化,ReadObj:將A反序列化)

class A:

  1. package woxingwosu;  
  2. import java.io.Serializable;  
  3. public class A implements Serializable{  
  4. private String name="my name is a";  
  5. private B b=null;  
  6. A(){  
  7. b=new B();  
  8. }  
  9. public B getB() {  
  10. return b;  
  11. }  
  12. public void setB(B b) {  
  13. this.b = b;  
  14. }  
  15. public String getName() {  
  16. return name;  
  17. }  
  18. public void setName(String name) {  
  19. this.name = name;  
  20. }  
  21. public String show(){  
  22. return "a.toString <a.name=\""+this.name+"\" a.b.name=\""+this.b.getName()+"\">" 
  23. +"\na="+this.toString()+" b="+this.b.toString();  
  24. }  

class B:

  1. package woxingwosu;  
  2. import java.io.Serializable;  
  3. public class B implements Serializable{  
  4. private String name="my name is B";  
  5. B(){}  
  6. public String getName() {  
  7. return name;  
  8. }  
  9. public void setName(String name) {  
  10. this.name = name;  
  11. }  

class WriteSeri:

  1. package woxingwosu;  
  2. import java.io.FileOutputStream;  
  3. import java.io.ObjectOutputStream;  
  4. /**  
  5. * 寫Object(系列化)  
  6. * @author 我行我素  
  7. */ 
  8. public class WriteSeri {  
  9. public static void main(String[] args) {  
  10. ObjectOutputStream outObj=null;  
  11. try{  
  12. FileOutputStream outStr=new FileOutputStream("obj.txt");  
  13. outObj=new ObjectOutputStream(outStr);  
  14. A a=new A();  
  15. outObj.writeObject(a);  
  16. System.out.println("write obj :"+a.show());  
  17. outObj.flush();  
  18. }catch(Exception e){  
  19. e.printStackTrace();  
  20. }finally{  
  21. try{  
  22. if(outObj!=null)  
  23. outObj.close();  
  24. }catch(Exception e){  
  25. e.printStackTrace();  
  26. }  
  27. }  
  28. }} 

class ReadSeri:

  1. package woxingwosu;  
  2. import java.io.FileInputStream;  
  3. import java.io.ObjectInputStream;  
  4. /**  
  5. * 讀Object(反系列化)  
  6. * @author 我行我素  
  7. */ 
  8. public class ReadSeri {  
  9. public static void main(String[] args) {  
  10. ObjectInputStream inObj=null;  
  11. try{  
  12. FileInputStream inStr=new FileInputStream("obj.txt");  
  13. inObj=new ObjectInputStream(inStr);  
  14. A a=(A)inObj.readObject();  
  15. System.out.println("read Object :"+a.show());  
  16. }catch(Exception e){  
  17. e.printStackTrace();  
  18. }finally{  
  19. try{  
  20. if(inObj!=null)  
  21. inObj.close();  
  22. }catch(Exception e){  
  23. e.printStackTrace();  
  24. }  
  25. }  
  26. }  

首先,我們運行WriteObj,實現序列化,得到輸出結果

  1. write obj :a.toString <a.name="my name is a" a.b.name="my name is B">  
  2. a=woxingwosu.A@a90653 b=woxingwosu.B@de6ced  

然后我們再運行ReadObj,實現反序列化,得到輸出結果

  1. read Object :a.toString <a.namea.name="my name is a" a.b.name="my name is B"> 
  2. a=woxingwosu.A@a90653 b=woxingwosu.B@de6ced 

遺漏了一個問題,就是標識版本的serialVersionUID。

官方文檔:如果可序列化類未顯式聲明 serialVersionUID,則序列化運行時將基于該類的各個方面計算該類的默認 serialVersionUID 值,如“Java(TM) 對象序列化規范”中所述。不過,強烈建議 所有可序列化類都顯式聲明 serialVersionUID 值,原因計算默認的 serialVersionUID 對類的詳細信息具有較高的敏感性,根據編譯器實現的不同可能千差萬別,這樣在反序列化過程中可能會導致意外的 InvalidClassException。因此,為保證 serialVersionUID 值跨不同 java 編譯器實現的一致性,序列化類必須聲明一個明確的 serialVersionUID 值。還強烈建議使用 private 修改器顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應用于立即聲明類 -- serialVersionUID 字段作為繼承成員沒有用處。

剛才寫的例子中就沒有用到serialVersionUID,這時JVM會根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段作為serialVersionUID。但是如果序列化和反序列化的JVM版本不一樣的話,還是顯示寫上serialVersionUID安全。

以上是個人看法,如有錯誤之處,還望指出。

原文地址:http://www.blogjava.net/woxingwosu/archive/2007/07/12/129511.html

【編輯推薦】

  1. 對象的序列化和反序列化
  2. 深入C# 序列化(Serialize)、反序列化(Deserialize)
  3. 談談序列化,關于.net中的二進制序列化和xml序列化
  4. javascript的search和match方法
  5. HTML中Form屬性Name和ID的區別
責任編輯:于鐵 來源: 博客園
相關推薦

2016-12-05 18:32:08

序列化androidjava

2020-12-24 18:46:11

Java序列化編程語言

2025-04-30 10:49:11

Java序列化反序列化

2024-09-03 08:17:59

2022-08-06 08:41:18

序列化反序列化Hessian

2025-05-08 08:30:00

Redis自定義序列化數據庫

2025-03-05 10:49:32

2023-03-09 08:23:07

序列化?接口方法

2023-09-12 07:24:07

Java序列化接口

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2010-01-08 13:25:07

ibmdwXML

2009-03-10 13:38:01

Java序列化字節流

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2023-12-13 13:49:52

Python序列化模塊

2018-03-19 10:20:23

Java序列化反序列化

2013-03-11 13:55:03

JavaJSON

2011-06-01 14:50:48

2019-11-20 10:07:23

web安全PHP序列化反序列化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看大片bbbb欧美 | 国产亚洲精品成人av久久ww | 婷婷色在线 | 精品福利在线 | 欧美久久综合 | 成人在线视频网站 | 国产乱码高清区二区三区在线 | 九九视频在线观看视频6 | 亚洲一二三在线观看 | 日韩网站免费观看 | 亚洲精品视频在线看 | 国产精品视屏 | 男女视频在线免费观看 | 欧美白人做受xxxx视频 | 日韩一区精品 | 欧美999| 久久艹免费视频 | 久久精彩 | 欧美激情免费在线 | 午夜视频在线免费观看 | 亚洲精品99久久久久久 | 中文在线a在线 | www.成人久久 | 亚洲成人av在线播放 | 国产一区二区三区在线看 | 日韩欧美在线观看 | 亚洲精品视频网站在线观看 | 国偷自产av一区二区三区 | 中国美女一级黄色片 | 免费视频一区二区 | 亚洲av毛片成人精品 | av天天爽| www.788.com色淫免费 | 成年人的视频免费观看 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 久久久做 | 欧美国产精品一区二区三区 | 天天艹| 久久婷婷色 | 九九av| 91日韩|