×

Serialization và Deserialization trong Java là gì?

Trong Java, serialization là quá trình chuyển đổi một đối tượng thành một dạng dữ liệu có thể được lưu trữ hoặc truyền đi, thường là dưới dạng dòng byte, để sau này có thể tái tạo lại đối tượng ban đầu từ dữ liệu này. Deserialization là quá trình ngược lại, chuyển đổi dữ liệu đã được serialized trở lại thành đối tượng.

Serialization

Để một đối tượng Java có thể được serialize, lớp của nó phải thực hiện giao diện java.io.Serializable. Giao diện này không chứa bất kỳ phương thức nào (là một marker interface), nó chỉ báo hiệu cho JVM rằng lớp này có thể được serialize.

Ví dụ Serialization:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    public String name;
    public String address;
    // Constructor, Getters và Setters
}

public class SerializationExample {
    public static void main(String[] args) {
        Employee emp = new Employee();
        emp.name = "John Doe";
        emp.address = "123 Street";

        try {
            FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(emp);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in /tmp/employee.ser");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

Deserialization

Deserialization là quá trình đọc dữ liệu từ một nguồn (thường là file) và chuyển đổi nó trở lại thành một đối tượng.

Ví dụ Deserialization:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class DeserializationExample {
    public static void main(String[] args) {
        Employee emp = null;
        try {
            FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            emp = (Employee) in.readObject();
            in.close();
            fileIn.close();
        } catch (IOException i) {
            i.printStackTrace();
            return;
        } catch (ClassNotFoundException c) {
            System.out.println("Employee class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Employee...");
        System.out.println("Name: " + emp.name);
        System.out.println("Address: " + emp.address);
    }
}

Lưu ý khi sử dụng Serialization:

  • Chỉ các đối tượng của lớp được đánh dấu là Serializable mới có thể được serialize.
  • Các trường transient trong một đối tượng sẽ bị bỏ qua và không được bao gồm trong quá trình serialization.
  • Sử dụng serialVersionUID để duy trì tính tương thích của các phiên bản class khác nhau trong quá trình serialization và deserialization.

Serialization và Deserialization là hai khái niệm quan trọng trong Java, cho phép lưu trữ và truyền tải các đối tượng trong một dạng dễ dàng quản lý.

Comments