什麼是序列化
我們的對象并不隻是存在記憶體中,還需要傳輸網絡,或者儲存起來下次再加載出來用,是以需要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通用格式的資料,再恢複原來的對象。
推薦閱讀
什麼是Spring Boot? Spring Boot開啟的2種方式 Spring Boot Starters啟動器 Spring Boot定制啟動圖案 Spring Boot核心配置 Spring Boot功能實戰 Spring Boot自動配置原理、實戰 Spring Boot Runner啟動器 Spring Boot - Profile不同環境配置看完有沒有收獲?分享到朋友圈給更多的人吧。