日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java自定義序列化行為解析

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

在肅北等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站制作,肅北網(wǎng)站建設(shè)費用合理。

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

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(10, 50);   
  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.     }   

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

但是輸出是:

Java代碼

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

結(jié)果和期望不符,子類的值域保留下來了,但是超類的值域丟失了,這對jvm來說是正常的,因為超類不可序列化;

為了解決這個問題,只能自定義序列化行為,具體做法是在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對象時會分別調(diào)用的兩個方法,修飾符都是private,沒錯。

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

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

Java代碼

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

另外還有兩個自定義序列化方法writeReplace和readResolve,分別用來在序列化之前替換序列化對象 和 在反序列化之后的對返回對象的處理。一般可以用來避免singleTon對象跨jvm序列化和反序列化時產(chǎn)生多個對象實例,事實上singleTon的對象一旦可序列化,它就不能保證singleTon了。JVM的Enum實現(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之后。


名稱欄目:Java自定義序列化行為解析
轉(zhuǎn)載注明:http://m.5511xx.com/article/dpehggh.html