Java序列化之Serializable

1.需求

        1.什麼是Java序列化java

2.詳解

         1.序列化  理解爲"打碎"便可安全

          2.在書本上序列化的意思是將Java對象轉爲二進制服務器

          3.java平臺容許咱們在內存中建立對象,當JVM運行時對象才能存在,若是JVM中止,對象消失 ide

 若是咱們須要Java對象在JVM中止後,可以保存對象,而且在未來能讀取保存的對象,這是須要序列化this

3.使用Java序列化

        使用Java對象序列化時,會將對象保存爲一組字節,對象序列化保存的時對象狀態,就是對象的成員變量加密

對象序列化不會關注類中的靜態變量spa

4.舉個栗子

建立一個User類,用於序列化及反序列化code

public class User implements Serializable {

    private static final long serialVersionUID = -6849794470754667710L;
    

    private String name;

    private Integer age;

    private transient String gender;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

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

 

序列化和反序列化對象

public class Client {

    @Test
    public void serializable() throws Exception {
        User user = new User();
        user.setName("hollis");
        user.setAge(23);
        user.setGender("man");
        System.out.println(user);
        //Write Obj to File
        ObjectOutputStream oos = null;
        oos = new ObjectOutputStream(new FileOutputStream("temp"));
        oos.writeObject(user);
        oos.close();
    }

    @Test
    public void unSerializable() throws Exception {
        ObjectInputStream ois= new ObjectInputStream(new FileInputStream(new File("temp")));
        User newUser = (User) ois.readObject();
        System.out.println(newUser);
        ois.close();
    }

}

5. 注意

一、在Java中,只要一個類實現了java.io.Serializable接口,那麼它就能夠被序列化。接口

二、經過ObjectOutputStreamObjectInputStream對對象進行序列化及反序列化

三、虛擬機是否容許反序列化,不只取決於類路徑和功能代碼是否一致,一個很是重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID

四、序列化並不保存靜態變量。

五、要想將父類對象也序列化,就須要讓父類也實現Serializable 接口。

六、Transient 關鍵字的做用是控制變量的序列化,在變量聲明前加上該關鍵字,能夠阻止該變量被序列化到文件中,在被反序列化後,transient 變量的值被設爲初始值,如 int 型的是 0,對象型的是 null。

七、服務器端給客戶端發送序列化對象數據,對象中有一些數據是敏感的,好比密碼字符串等,但願對該密碼字段在序列化時,進行加密,而客戶端若是擁有解密的密鑰,只有在客戶端進行反序列化時,才能夠對密碼進行讀取,這樣能夠必定程度保證序列化對象的數據安全。

相關文章
相關標籤/搜索