【Java】Java序列化學習總結 2018-10-5
阿新 • • 發佈:2018-12-13
Java序列化學習總結
什麼是序列化
我們的物件並不只是存在記憶體中,還需要傳輸網路,或者儲存起來下次再加載出來用,所以需要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通用格式的資料,再恢復原來的物件。
-
如果某個欄位不想序列化,在該欄位前加上transient關鍵字即可。