java對象的序列化和反序列化
阿新 • • 發佈:2017-09-19
底層 修飾 我們 puts nbsp tostring read one asics
一,對象的序列化,反序列化
1.對象的序列化,就是將Object轉換成byte序列,反之叫對象的反序列化
2.做序列化需要有流類,序列化流(ObjectOutputStream),是(字節的)過濾流,有writeObject方法,寫一個對象
反序列化 流(ObjectInputStream)----readObject
3.序列化接口(Serializable)
對象必須實現序列化接口,才能進行序列化,否則將出現異常
這個接口,沒有任何方法,只是一個標準
/**
* 如果將來希望這個對象能在網絡中傳輸,也需要把這個對象進行序列化。(在網絡中是以字節為單位進行傳輸的)
* 所以當我們要保存這個對象,或在網絡中傳輸這個對象時,都需要對這個對象進行序列化
*/
二,transient關鍵字
一個對象中有些屬性不需要序列化,可以用transient關鍵子修飾。
用transient修飾的元素,該元素不會進行jvm默認的序列化。也可以自己完成這個元素的序列化
(在網絡傳輸中,有些元素不需要傳輸,也就不用序列化,這樣可以節省網絡傳輸的流量)
如何自己完成序列化呢?
有兩個方法簽名可以實現。可以參考ArrayList裏的兩個方法 :
writeObject(java.io.ObjectOutputStream s),readObject(java.io.ObjectInputStream s)
ArrayList序列化優化的問題(ArrayList源碼)
ArrayList底層是數組,但我們往list中添加數據時,有添加不滿的情況。數組中為空的元素就不用序列化了,這樣可以提高性能
package com.amazing.jdk.learn2Serializable.basicSerializable_08_15; import java.io.Serializable; /** * Created by yaming on 17-8-15. */ public class Student implements Serializable { private Long id; private String name; private char gender; private transient double money; publicLong getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getGender() { return gender; } publicvoid setGender(char gender) { this.gender = gender; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "Student{" + "id=" + id + ", name=‘" + name + ‘\‘‘ + ", gender=" + gender + ", money=" + money + ‘}‘; } //自己實現序列化 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ s.defaultWriteObject();//把jvm能默認序列化的元素進行序列化 s.writeDouble(money);//自己完成money的序列化,也可以用s.writeObject(money) } //自己實現反序列化 private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject();//把jvm能默認反序列化的元素進行反序列化 this.money=s.readDouble();//自己完成money的反序列化 } }
java對象的序列化和反序列化