Java 對象 序列化/反序列化 Serializable和 Externalizable 基本用法

概念

  1. 所謂序列化是把 Java對象轉換成字節流保存到本地文件
  2. 反序列化是指從磁盤讀取相關字節流轉換成 Java對象的過程

主要功能場景

  1. 持久化到磁盤, 存到數據庫等
  2. 爲了網絡中傳輸對象
  3. 爲了進程之間傳遞對象

Serializable序列化

類實現 Serializable

  • Java類只要實現了 java.io.Serializable接口就可以序列化相關對象

public class User implements Serializable {
    private static final long serialVersionUID = -5142052165948444605L;
    private Integer age;
    private String name;

    public User() {}

    public Integer getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

對象 序列化/反序列化

  • ObjectInputStream 從字節流中讀取對象
  • ObjectOutputStream 對象轉換字節流寫入

public class App {
    public static void main(String[] args) {
        final User user = new User();
        user.setAge(30);
        user.setName("Shawn Jeon");
        try {
            File file = new File("D:" + File.separator + "User");
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            /** 對象寫入到文件*/
            oos.writeObject(user);

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
            /** 從磁盤讀取對象*/
            User user2 = (User) ois.readObject();
            System.out.println(user2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

# 輸出 User{age=30, name='Shawn Jeon'}

Externalizable序列化

類實現 Externalizable

  • Java類只要實現了 java.io.Externalizable接口後 @Override相關方法來實現序列化

public class Person implements Externalizable {
    private static final long serialVersionUID = 7274549675763175797L;
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(age);
        out.writeObject(name);
    }

    @Override
    public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {
        this.age = (Integer) oi.readObject();
        this.name = (String) oi.readObject();
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

對象 序列化/反序列化


public class PersonApp {
    public static void main(String[] args) {
        final Person person = new Person();
        person.setAge(30);
        person.setName("Shawn Jeon");
        try {
            File file = new File("D:" + File.separator + "Person");
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            /** 對象寫入到文件*/
            oos.writeObject(person);

            ObjectInputStream ois= new ObjectInputStream(new FileInputStream(file));
            /** 從磁盤讀取對象*/
            Person person2 = (Person) ois.readObject();
            System.out.println(person2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

# 輸出 Person{age=30, name='Shawn Jeon'}

transient關鍵字

  • 對象序列化時可以指定忽略屬性

private transient String name;

序列化ID serialVersionUID

  • serialVersionUID是指定相關序列化對象版本的, 如果序列化後改動此版本 Java JVM會拋出序列化版本不一致的異常

如果您覺得有幫助,歡迎點贊哦 ~ 謝謝!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章