1. 程式人生 > >java基礎序--列化和反序列化

java基礎序--列化和反序列化

color tran public png gin jdk style 硬盤 brush

一、什麽是序列化和反序列化:

  序列化:是指把java堆內存中的對象轉換成字節(二進制流)的過程。也就是通過某種方式將java對象存儲在磁盤內存中,這個過程稱為序列化

  反序列化:是把磁盤上的對象轉恢復成java對象的過程。

二、序列化和反序列化優點:

  1、分布式系統中,需要把對象在網絡傳輸,需要將對象轉換成二進制流形式,需要共享的javabean對象都需要進行序列化。

  2、服務器鈍化,服務器發現某些對象好久沒有活動,服務器就會將某些對象存儲在本地內存中,需要的時候去內存中尋找,然後反序列化成java對象,節省服務器內存。

  總結:①、實現了數據的持久化,通過序列化保存在本地硬盤上。②、利用序列化實現了遠程通信。

三、序列化的必要條件:

  1、需要實現Java.lang.Serializable 接口,java中大多類都實現類改接口。例:String Integer

  2、斷層會判斷,當前對象是 Serializable 的實例,才允許做序列化,Java對象 instanceof Serializable 來判斷

  3、jdk中的api:

  ObjectOutputStream 中的 writeObject() 方法進行序列化操作

  ObjectInputStream 中的readObject() 方法進行反序列化操作

技術分享圖片

  javabean 如果不實現 java.io.Serializable 接口

  技術分享圖片

  demo:  

package com.liuxn.Serialization.javaBean;

import java.io.Serializable;

/**
 * Created by Administrator on 2018/6/13.
 * 創建一個javabean 實現 Serializable 接口
 */
public class User implements Serializable {

    //需要進行序列化的字段
    private String name;

    private int age;

    transient private String className;//不需要進行序列化的字段

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public void setAge(int age) {
        this.age = age;
    }

//    public User(String name, int age) {
//        this.name = name;
//        this.age = age;
//    }
//
//
//    public User() {
//    }


    @Override
    public String toString() {
        return "User{" +
                "name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", className=‘" + className + ‘\‘‘ +
                ‘}‘;
    }
}
package com.liuxn.Serialization.test;

import com.liuxn.Serialization.javaBean.User;

import java.io.*;

/**
 * Created by Administrator on 2018/6/13.
 *
 * 用於測試序列化和反序列化 測試類
 */
public class TestSerialization {

    public static void main(String[] args) {
        /**
         * 使用ObjectOutputStream實現序列化
         */
        User user = new User();
        user.setAge(10);
        user.setName("小明");
        System.out.println(user);

        ObjectOutputStream oos = null;
        try {
            OutputStream op = new FileOutputStream("F:\\360WiFi"+ File.separator+"a.txt");
            oos = new ObjectOutputStream(op);
            oos.writeObject(user);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         *  ObjectInputStream 實現反序列化
         */
        try {
            InputStream in = new FileInputStream("F:\\360WiFi"+ File.separator+"a.txt");
            ObjectInputStream os = new ObjectInputStream(in);
            byte[] buffer = new byte[10];
            int len = -1;
            User u = (User) os.readObject();
            System.out.println("反序列化:");
            System.out.println(u);
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

  

//輸出結果:
User{name=‘小明‘, age=10}
反序列化:User{name=‘小明‘, age=10}

  在序列化時,如果javabean完成序列化後,修改javabean,在次進行反序列化會出現以下問題:

技術分享圖片

  解決:

  在javabean中條添加 serialVersionUID 固定版本。

  private static final long serialVersionUID = 1L;

  javabean

java基礎序--列化和反序列化