1. 程式人生 > >序列化簡介

序列化簡介

實現接口 serialize 對象序列化 DC leo 如果 示例 ID 類信息

  • 講的太好了博文
簡述

java序列化是將堆內存中存放的java對象放在存放在硬盤或者以字節流的方式在網絡中傳輸。另一種表述:序列化是將結構化的對象數據以非結構的字節流形式存放在本地或者在網絡中傳輸。

【註】:java對象存放在堆內存中,基本數據類型存放在更快的棧內存中,常量存放在常量池中。
  

與反射的區別是:序列化用於將內存中對象信息放在硬盤中,一般是對象的變量當前值;反射是將硬盤中類信息放在內存中。

實現方式

  java序列化的實現方式一般是借助java.io包下的FileOutputStreamObjectOutputStream類,以及new ObjectOutputStream().writeObject(targetFile)方法。示例:
  

//1.設置序列化文件目標位置
FileOutputStream fs=new FileOutputStream("E:\\a.bat");
//2.獲取ObjectOutputStream對象
ObjectOutputStream os=new ObjectOutputStream(fs);
//3.使用writeObject(Object X);方法將對象數據寫入文件;
os.writeObject(obj1);
//4.關閉流,必須且好的編碼習慣
os.close();

重要1:序列化與反序列化

要序列化的類必須實現接口Serializable,此接口是個空接口,僅僅用於表示實現改接口的類可以序列化。真正實現序列化的類是ObjectInputStream

ObjectOutputStream。示例如下,將一個對象序列化,然後在讀入並打印
  

package javaX.ioX.SerializableX;

import java.io.*;

/**
 * 序列化對象;從磁盤讀取硬盤對象;
 * @author dugenkui
 *         on 2017/10/24.
 */
public class TestSerialize implements Serializable{

    int varX=1;

    String varY ="dugenkuiX";

    @Override
    public String toString() {
        System.out.println(varX+":"+varY);
        return varX+varY;
    }

    public static void main(String[] args) throws IOException {

        //序列化此對象;try()中的資源可以在try代碼塊運行完以後自動釋放,不用再X.close()。
        // 資源必須實現java.lang.AutoCloseable接口或java.io.Closeable。
        try (FileOutputStream fileOutputStream=new FileOutputStream("E:\\a.dat");
             ObjectOutputStream os = new ObjectOutputStream(fileOutputStream);) {

                os.writeObject(new TestSerialize());

        }catch (Exception e){
            e.printStackTrace();
        }

        //讀取本地磁盤中序列化的對象,並打印;
        try(FileInputStream fs=new FileInputStream("E:\\a.dat");
            ObjectInputStream in=new ObjectInputStream(fs)){

            TestSerialize object=(TestSerialize)in.readObject();
            object.toString();

        }catch(ClassNotFoundException x){
                x.printStackTrace();
        }
    }
}

重要2:版本號serialVersionUID

對一個類X對象進行序列化和反序列化是,“發送端”類和“接收端”類都會有一個serialVersionUID/long類型,記錄了序列化類的版本號。

 private static final long serialVersionUID = 2L;

  如果接收端的版本號與發送端的版本號不一致,會拋異常InvalidClassException和相應的提示。

重要3:序列化對象不保存靜態變量
   

        try (FileOutputStream fileOutputStream=new FileOutputStream("E:\\a.dat");
             ObjectOutputStream os = new ObjectOutputStream(fileOutputStream);) {

                os.writeObject(new TestSerialize());
        }catch (Exception e){
            e.printStackTrace();
        }

        staticVar=22;//在序列化對象後在改變靜態變量的值,反序列化對象後讀取此值,是22。靜態變量不能保存在序列化文件中

        //讀取本地磁盤中序列化的對象,並打印;
        try(FileInputStream fs=new FileInputStream("E:\\a.dat");
            ObjectInputStream in=new ObjectInputStream(fs)){
            
            TestSerialize object=(TestSerialize)in.readObject();
            System.out.println(object.staticVar);//輸入22.等於用反序列化的對象調用了本地類的變量。
        }catch(ClassNotFoundException x){
                x.printStackTrace();
        }

重要4:序列化的類必須繼承Serializable,如果其父類已經繼承他就不用再繼承了

序列化簡介