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

Java自定義序列化行為解析

開發(fā) 后端
正常情況下,一個(gè)類實(shí)現(xiàn)java序列化很簡單,只需要implements Serializable接口即可,之后該類在跨jvm的傳輸過程中會遵照默認(rèn)java序列化規(guī)則序列化和反序列化;不同jvm版本之間序列化方式稍有不同,但基本上都是兼容的。

正常情況下,一個(gè)類實(shí)現(xiàn)java序列化很簡單,只需要implements Serializable接口即可,之后該類在跨jvm的傳輸過程中會遵照默認(rèn)java序列化規(guī)則序列化和反序列化;不同jvm版本之間序列化方式稍有不同,但基本上都是兼容的。

在某些特殊情況下,可能需要自定義序列化和反序列化的行為,看下面例子:

Java代碼

  1. class AbstractSerializeDemo {     
  2.     private int x, y;     
  3.     
  4.     public void init(int x, int y) {     
  5.         this.x = x;     
  6.         this.y = y;     
  7.     }     
  8.     
  9.     public int getX() {     
  10.         return x;     
  11.     }     
  12.     
  13.     public int getY() {     
  14.         return y;     
  15.     }     
  16.     
  17.     public void printXY() {     
  18.         System.out.println("x:" + x + ";y:" + y);     
  19.     }     
  20. }     
  21.     
  22. public class SerializeDemo extends AbstractSerializeDemo implements Serializable {     
  23.     private int z;     
  24.     
  25.     public SerializeDemo() {     
  26.         super.init(1050);     
  27.         z = 100;     
  28.     }     
  29.     
  30.     public void printZ() {     
  31.         super.printXY();     
  32.         System.out.println("z:" + z);     
  33.     }     
  34.     
  35.     public static void main(String[] args) throws IOException, ClassNotFoundException {     
  36.         ByteArrayOutputStream bos = new ByteArrayOutputStream();     
  37.         ObjectOutputStream out = new ObjectOutputStream(bos);     
  38.         SerializeDemo sd = new SerializeDemo();     
  39.         sd.printZ();     
  40.         out.writeObject(sd);     
  41.         ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));     
  42.         SerializeDemo sd2 = (SerializeDemo) in.readObject();     
  43.         sd2.printZ();     
  44.     }     
  45. }  

 

這段程序表示了一個(gè)可序列化的類繼承自一個(gè)非序列化的有狀態(tài)超類,期望的結(jié)果是,子類序列化以后傳輸并反序列化回來,原先的值域包括超類的值域都保持不變。

但是輸出是:

Java代碼

  1. x:10;y:50    
  2. z:100    
  3. x:0;y:0    
  4. z:100    

 

結(jié)果和期望不符,子類的值域保留下來了,但是超類的值域丟失了,這對jvm來說是正常的,因?yàn)槌惒豢尚蛄谢?

為了解決這個(gè)問題,只能自定義序列化行為,具體做法是在SerializeDemo里加入以下代碼:

Java代碼

  1. private void writeObject(ObjectOutputStream os) throws IOException {     
  2.       os.defaultWriteObject();//java對象序列化默認(rèn)操作     
  3.       os.writeInt(getX());     
  4.       os.writeInt(getY());     
  5.   }     
  6.     
  7.   private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {     
  8.       is.defaultReadObject();//java對象反序列化默認(rèn)操作     
  9.       int x=is.readInt();     
  10.       int y=is.readInt();     
  11.       super.init(x,y);     
  12.   }   

 

writeObject和readObject方法為JVM會在序列化和反序列化java對象時(shí)會分別調(diào)用的兩個(gè)方法,修飾符都是private,沒錯(cuò)。

我們在序列化的默認(rèn)動(dòng)作之后將超類里的兩個(gè)值域x和y也寫入object流;與之對應(yīng)在反序列化的默認(rèn)操作之后讀入x和y兩個(gè)值,然后調(diào)用超類的初始化方法。

再次執(zhí)行程序之后的輸出為:

Java代碼

  1. x:10;y:50    
  2. z:100    
  3. x:10;y:50    
  4. z:100   

 

另外還有兩個(gè)自定義序列化方法writeReplace和readResolve,分別用來在序列化之前替換序列化對象 和 在反序列化之后的對返回對象的處理。一般可以用來避免singleTon對象跨jvm序列化和反序列化時(shí)產(chǎn)生多個(gè)對象實(shí)例,事實(shí)上singleTon的對象一旦可序列化,它就不能保證singleTon了。JVM的Enum實(shí)現(xiàn)里就是重寫了readResolve方法,由JVM保證Enum的值都是singleTon的,所以建議多使用Enum代替使用writeReplace和readResolve方法。

Java代碼

  1. private Object readResolve()     
  2.     {     
  3.         return INSTANCE;     
  4.     }     
  5.         
  6.     private Object writeReplace(){     
  7.         return INSTANCE;     
  8.     }    

 

注:writeReplace調(diào)用在writeObject前;readResolve調(diào)用在readObject之后。

【編輯推薦】

  1. Java序列化的機(jī)制和原理
  2. Java Socket通信的序列化和反序列化代碼介紹
  3. Java輸入數(shù)據(jù)流詳解
  4. Java語言深入 文件和流
  5. Java對象序列化
責(zé)任編輯:金賀 來源: ITEYE博客
相關(guān)推薦

2025-05-08 08:30:00

Redis自定義序列化數(shù)據(jù)庫

2025-03-05 10:49:32

2024-02-22 08:06:45

JSON策略解析器

2022-08-06 08:41:18

序列化反序列化Hessian

2018-03-19 10:20:23

Java序列化反序列化

2013-03-11 13:55:03

JavaJSON

2009-06-14 22:01:27

Java對象序列化反序列化

2009-09-09 16:30:59

C# BinaryFo

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2011-03-04 09:25:51

Java序列化

2020-04-20 11:19:00

Java開發(fā)序列化

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2023-12-13 13:49:52

Python序列化模塊

2010-03-19 15:54:21

Java Socket

2011-06-01 14:50:48

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:26:11

序列化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人国内精品久久久久一区 | 精品av | 亚洲性视频| 国内久久精品 | 国产真实乱对白精彩久久小说 | 国产 欧美 日韩 一区 | 精品国产18久久久久久二百 | www.xxxx欧美 | 国产精品激情小视频 | 在线视频三区 | 性一交一乱一透一a级 | 国产精品自拍视频网站 | 亚洲人成人一区二区在线观看 | 精品久久久久久国产 | av一级| 成人国产精品色哟哟 | 国产精品精品视频一区二区三区 | 久久国 | 欧美日韩综合视频 | 久草免费在线视频 | 久久夜夜| 欧美精品日韩 | 一区二区三区视频在线观看 | 亚洲91视频 | 91国内精精品久久久久久婷婷 | 亚洲最新在线视频 | 国产高清一区二区三区 | 成人免费网站在线 | 久久久久国产一区二区三区 | 日本久久一区二区三区 | 亚洲性人人天天夜夜摸 | 亚洲人成一区二区三区性色 | 狠狠躁18三区二区一区 | 国产精品夜色一区二区三区 | 成人99| 亚洲一区综合 | 欧美久久久久久 | 国产色视频网站 | 亚洲在线 | 日韩欧美国产精品 | 亚洲欧美中文字幕 |