Trong Java, Serialization và Deserialization là hai khái niệm quan trọng giúp chúng ta lưu trữ và truyền tải đối tượng một cách hiệu quả. Bài viết này sẽ giải thích chi tiết về hai quá trình này, cách chúng hoạt động và ứng dụng của chúng trong lập trình Java.

1. Tổng quan về Serialization và Deserialization

  • Serialization là quá trình chuyển đổi một đối tượng Java thành một định dạng có thể lưu trữ (như tệp hoặc cơ sở dữ liệu) hoặc truyền tải qua mạng (như HTTP). Định dạng này thường là nhị phân, nhưng cũng có thể là văn bản như JSON hoặc XML.
  • Deserialization là quá trình ngược lại, tức là chuyển đổi định dạng đã lưu trữ trở lại thành đối tượng Java ban đầu. Quá trình này giúp phục hồi trạng thái của đối tượng mà không cần khởi tạo lại từ đầu.

2. Tại sao cần Serialization?

Serialization có nhiều ứng dụng quan trọng trong lập trình:

  • Lưu trữ đối tượng: Chúng ta có thể lưu trữ trạng thái của đối tượng trong tệp để sử dụng sau này, giúp tiết kiệm tài nguyên và thời gian khởi tạo lại.
  • Truyền tải qua mạng: Serialization cho phép chúng ta truyền tải các đối tượng qua mạng giữa các ứng dụng hoặc giữa máy chủ và khách hàng. Điều này đặc biệt hữu ích trong các ứng dụng phân tán hoặc dịch vụ web.
  • Ghi vào cơ sở dữ liệu: Các đối tượng có thể được chuyển đổi thành các định dạng có thể lưu trữ trong cơ sở dữ liệu, giúp quản lý dữ liệu dễ dàng hơn.

3. Cách thức hoạt động của Serialization

Để một đối tượng có thể được Serialization, lớp của nó cần phải triển khai interface Serializable. Interface này không có phương thức nào, nhưng nó đánh dấu lớp là có khả năng Serialization.

3.1. Cách thực hiện Serialization

Dưới đây là một ví dụ đơn giản về cách thực hiện Serialization:

import java.io.*;

// Lớp Person implement Serializable
class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        Person person = new Person("John Doe", 30);
        
        // Serialization
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
            System.out.println("Object has been serialized: " + person);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2. Ghi chú

  • Transient: Nếu bạn không muốn một trường nào đó được Serialization, bạn có thể khai báo nó là transient. Điều này có nghĩa là trường đó sẽ không được ghi lại trong quá trình Serialization.

4. Cách thức hoạt động của Deserialization

Để phục hồi đối tượng từ tệp đã được Serialization, bạn cần sử dụng ObjectInputStream. Quá trình này sẽ đọc lại định dạng đã lưu trữ và chuyển đổi nó trở lại thành đối tượng.

4.1. Cách thực hiện Deserialization

Dưới đây là ví dụ về cách thực hiện Deserialization từ tệp đã được Serialization trước đó:

import java.io.*;

public class DeserializationExample {
    public static void main(String[] args) {
        Person person = null;

        // Deserialization
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            person = (Person) ois.readObject();
            System.out.println("Object has been deserialized: " + person);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

5. Kết luận

Serialization và Deserialization là những kỹ thuật mạnh mẽ trong Java, cho phép chúng ta lưu trữ và truyền tải trạng thái của đối tượng một cách hiệu quả. Bằng cách sử dụng interface Serializable, lập trình viên có thể dễ dàng thao tác với các đối tượng trong ứng dụng của mình, giúp cho việc lưu trữ, truyền tải và quản lý dữ liệu trở nên đơn giản và linh hoạt hơn.