關於Java序列化你應該知道的一切
阿新 • • 發佈:2018-12-26
什麼是序列化
我們的物件並不只是存在記憶體中,還需要傳輸網路,或者儲存起來下次再加載出來用,所以需要Java序列化技術。
Java序列化技術正是將物件轉變成一串由二進位制位元組組成的陣列,可以通過將二進位制資料儲存到磁碟或者傳輸網路,磁碟或者網路接收者可以在物件的屬類的模板上來反序列化類的物件,達到物件持久化的目的。
怎麼序列化一個物件?
要序列化一個物件,這個物件所在類就必須實現Java序列化的介面:java.io.Serializable。
1、類新增序列化介面
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -8475669200846811112L;
private String username;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", address='" + address + '\'' +
'}';
}
}
2、序列化/反序列化
可以藉助commons-lang3工具包裡面的類實現物件的序列化及反序列化,你沒有必要自己寫。
import org.apache.commons.lang3.SerializationUtils;
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("Java");
user.setAddress("China");
byte[] bytes = SerializationUtils.serialize(user);
User u = SerializationUtils.deserialize(bytes);
System.out.println(u);
}
}
輸出:
User{username='Java', address='China'}
上例通過序列化物件位元組到記憶體然後反序列化,當然裡面也提供了序列化磁碟然後再反序列化的方法,原理都是一樣的,只是目標地不一樣。
序列化注意事項
序列化物件必須實現序列化介面。
序列化物件裡面的屬性是物件的話也要實現序列化介面。
類的物件序列化後,類的序列化ID不能輕易修改,不然反序列化會失敗。
類的物件序列化後,類的屬性有增加或者刪除不會影響序列化,只是值會丟失。
如果父類序列化了,子類會繼承父類的序列化,子類無需新增序列化介面。
如果父類沒有序列化,子類序列化了,子類中的屬效能正常序列化,但父類的屬性會丟失,不能序列化。
用Java序列化的二進位制位元組資料只能由Java反序列化,不能被其他語言反序列化。如果要進行前後端或者不同語言之間的互動一般需要將物件轉變成Json/Xml通用格式的資料,再恢復原來的物件。
推薦閱讀
分享Java乾貨,高併發程式設計,熱門技術教程,微服務及分散式技術,架構設計,區塊鏈技術,人工智慧,大資料,Java面試題,以及前沿熱門資訊等。