1.什麼是Java序列化java
1.序列化 理解爲"打碎"便可安全
2.在書本上序列化的意思是將Java對象轉爲二進制服務器
3.java平臺容許咱們在內存中建立對象,當JVM運行時對象才能存在,若是JVM中止,對象消失 ide
若是咱們須要Java對象在JVM中止後,可以保存對象,而且在未來能讀取保存的對象,這是須要序列化this
使用Java對象序列化時,會將對象保存爲一組字節,對象序列化保存的時對象狀態,就是對象的成員變量加密
對象序列化不會關注類中的靜態變量spa
建立一個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(); } }
一、在Java中,只要一個類實現了java.io.Serializable
接口,那麼它就能夠被序列化。接口
二、經過ObjectOutputStream
和ObjectInputStream
對對象進行序列化及反序列化
三、虛擬機是否容許反序列化,不只取決於類路徑和功能代碼是否一致,一個很是重要的一點是兩個類的序列化 ID 是否一致(就是 private static final long serialVersionUID
)
四、序列化並不保存靜態變量。
五、要想將父類對象也序列化,就須要讓父類也實現Serializable
接口。
六、Transient 關鍵字的做用是控制變量的序列化,在變量聲明前加上該關鍵字,能夠阻止該變量被序列化到文件中,在被反序列化後,transient 變量的值被設爲初始值,如 int 型的是 0,對象型的是 null。
七、服務器端給客戶端發送序列化對象數據,對象中有一些數據是敏感的,好比密碼字符串等,但願對該密碼字段在序列化時,進行加密,而客戶端若是擁有解密的密鑰,只有在客戶端進行反序列化時,才能夠對密碼進行讀取,這樣能夠必定程度保證序列化對象的數據安全。