Tags:

Marker Interface Serializable trong java

Serializable là một marker interface(Interface rỗng) các class của bạn phải implement nó nếu muốn đọc ghi xuống file, network etc.

Serializable là một marker interface không chứa bất kỳ một abstract method nên một class implement Serializable không cần triển khai bất kỳ method nào. Việc implement Serializable chỉ để thông báo rằng class này có thể sử dụng trong việc tuần tự hoá (ví dụ như đọc ghi file, chuyển qua network).

import java.io.Serializable;

public static class Person implements Serializable {
    public String name = null;
    public int    age  =   0;
}

Như các bạn thấy mặc dù Person class implement Serializable interface nhưng nó không cần triển khai bất cứ method nào. Để hiểu rõ hơn các bạn có thể xem qua đọc ghi file object để hiểu rõ cách áp dụng của Serializable hơn. 

serialVersionUID là gì?

Một class ngoài việc implement Serializable interface thì nó còn nên có một private static final long serialVersionUID.

import java.io.Serializable;

public static class Person implements Serializable {

    private static final long serialVersionUID = 1234L;

    public String name = null;
    public int    age  =   0;
}

serialVersionUID được sử dụng bởi các object serialization API của java. Nếu một object được deserialized(đọc dữ liệu vào object)serialized(ghi object) giống serialVersionUID thì quá trình deserialized sẽ cố gắng thực hiện thành công. Ngược lại quá trình deserialized có thể không tương ứng. 

Ví dụ Person object được serialized vào ổ đĩa với serialVersionUID 1234l. Sau đó Person class được sữa đổi (thêm/xóa thuộc tính, kiểu dữ liệu, tên thuộc tính etc) thì giá trị serialVersionUID sẽ phải cập nhập thành giá trị mới. Khi bạn cố gắng đọc dữ liệu được ghi với serialVersionUID 1234l vào Person class đã được sữa đổi thì dữ liệu sẽ không còn đúng nữa.

Vì vậy khi bạn có những thay đổi lớn trên các Serializable implementation thì bạn nên thay đổi giá trị của serialVersionUID.

Java SDK và rất nhiều các IDE chứ tool để generate serialVersionUID, bạn không phải tự đặt giá trị cho serialVersionUID.

Custom Serialization trong java

Java cung cấp cách serialized mặc định và chúng ta có thể thay đổi chúng thông qua việc override method thực hiện việc đọc ghi dữ liệu. Ví dụ như trong serialized object sử dụng ObjectInputStream và ObjectOutputStream, ta có thể override 2 method 

private void writeObject(ObjectOutputStream out) throws IOException;

và 

private void readObject(ObjectInputStream in) 
  throws IOException, ClassNotFoundException;
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    private transient Address address;
    private Person person;
 
    // setters and getters
 
    private void writeObject(ObjectOutputStream oos) 
      throws IOException {
        oos.defaultWriteObject();
        oos.writeObject(address.getHouseNumber());
    }
 
    private void readObject(ObjectInputStream ois) 
      throws ClassNotFoundException, IOException {
        ois.defaultReadObject();
        Integer houseNumber = (Integer) ois.readObject();
        Address a = new Address();
        a.setHouseNumber(houseNumber);
        this.setAddress(a);
    }
}
public class Address {
    private int houseNumber;
 
    // setters and getters
}

Address class không implement Serializable interface nhưng chúng ta cũng có thể tham các thuộc tính của nó vào quá trình đọc ghi dữ liệu trong Object Stream.

Nguồn tham khảo

http://tutorials.jenkov.com/java-io/serializable.html#object-serialization-today

https://www.baeldung.com/java-serialization

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x