關於Java序列化你應該知道的一切

Java

Posted by Java on 2019-11-11 14:12:00

什麼是序列化

我們的對象並不只是存在內存中,還需要傳輸網絡,或者保存起來下次再加載出來用,所以需要Java序列化技術。

Java序列化技術正是將對象轉變成一串由二進製字節組成的數組,可以通過將二進制數據保存到磁盤或者傳輸網絡,磁盤或者網絡接收者可以在對象的屬類的模板上來反序列化類的對象,達到對象持久化的目的。

怎麼序列化一個對象?

要序列化一個對象,這個對象所在類就必須實現Java序列化的接口:java.io.Serializable。

1、類添加序列化接口


 

 

 

 

 

 

 

 

 

 

  1. import java.io.Serializable;

  2. public class User implements Serializable{

  3.    private static final long serialVersionUID = -8475669200846811112L;

  4.    private String username;

  5.    private String address;

  6.    public String getUsername() {

  7.        return username;

  8.    }

  9.    public void setUsername(String username) {

  10.        this.username = username;

  11.    }

  12.    public String getAddress() {

  13.        return address;

  14.    }

  15.    public void setAddress(String address) {

  16.        this.address = address;

  17.    }

  18.    @Override

  19.    public String toString() {

  20.        return "User{" +

  21.                "username='" + username + '\'' +

  22.                ", address='" + address + '\'' +

  23.                '}';

  24.    }

  25. }

2、序列化/反序列化

可以藉助commons-lang3工具包裡面的類實現對象的序列化及反序列化,你沒有必要自己寫。


 

 

 

 

 

 

  1. import org.apache.commons.lang3.SerializationUtils;

  2. public class Test {

  3.    public static void main(String[] args) {

  4.        User user = new User();

  5.        user.setUsername("Java");

  6.        user.setAddress("China");

  7.        byte[] bytes = SerializationUtils.serialize(user);

  8.        User u = SerializationUtils.deserialize(bytes);

  9.        System.out.println(u);

  10.    }

  11. }

輸出:


 
  1. User{username='Java', address='China'}

上例通過序列化對象字節到內存然後反序列化,當然裡面也提供了序列化磁盤然後再反序列化的方法,原理都是一樣的,只是目標地不一樣。

序列化注意事項

  • 序列化對象必須實現序列化接口。

  • 序列化對象裡面的屬性是對象的話也要實現序列化接口。

  • 類的對象序列化後,類的序列化ID不能輕易修改,不然反序列化會失敗。

  • 類的對象序列化後,類的屬性有增加或者刪除不會影響序列化,只是值會丟失。

  • 如果父類序列化了,子類會繼承父類的序列化,子類無需添加序列化接口。

  • 如果父類沒有序列化,子類序列化了,子類中的屬性能正常序列化,但父類的屬性會丟失,不能序列化。

  • 用Java序列化的二進製字節數據只能由Java反序列化,不能被其他語言反序列化。如果要進行前後端或者不同語言之間的交互一般需要將對象轉變成Json/Xml通用格式的數據,再恢復原來的對象。

     

  • 如果某個字段不想序列化,在該字段前加上transient 關鍵字即可。