2. Chương 2: LẬP TRÌNH PHÂN TÁN VỚI RMI
1.6. TUẦN TỰ HÓA (SERIALIZABLE) ĐỐI TƯỢNG
Java cung cấp khả năng ghi toàn bộ đối tượng xuống một tập tin. Sau đó có thể đem tập tin chứa đối tượng đi khắp nơi nếu cần thì khôi phục đối tượng về trạng thái ban đầu. Đối tượng trong bộ nhớ có thể quan hệ chằng chịt với nhau nhưng khi được ghi xuống tập tin thì bắt buộc phải trải phẳng đối tượng theo thứ tự.
Trong Java đối tượng muốn có khả năng ghi và lưu dữ liệu thành tập tin ta phải cài đặt giao tiếp java.io.Serializable. Nếu đối tượng cần ghi chứa bên trong nhiều đối tượng con khác thì Java lấy tất cả các đối tượng con ghi luôn xuống đĩa.
Dưới đây là ví dụ cho thấy khả năng tuần tự hóa của một đối tượng phức hợp.
// WriteObjectApp.java import java.io.*;
class LinkObject implements Serializable { static int count=1;
LinkObject next; int id;
public LinkObject (int id) { this.id=id;
if (count < 50) { count ++;
next = new LinkObject (count); }
else next = null; }
public String toString() { return (“Object ” + id); }
}
class WriteObjectApp {
public static void main (String args[]) { try {
//tạo file để lưu đối tượng
ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream (“objects.dat”));
// khởi tạo đối tượng trong bộ nhớ
LinkObject X = new LinkObject (1); System.out.println (“X is “ + X); //ghi đối tượng lên tập tin
out.writeObject (X);
//in nội dung đối tượng lên màn hình
System.out.println (“Here is object content”); while ((X=X.next)!=null) {
System.out.println (X); }
}
catch (IOException e) {System.out.println (e);} }
}
Như ta thấy, khi khởi tạo đối tượng LinkObject, phương thức khởi tạo của LinkObject tự động tạo ra 50 đối tượng khác liên kết với nhau thành một danh sách liên kết. Do LinkObject cài đặt giao tiếp Serializable nên nó có khả năng ghi được thành tập tin trên đĩa.
Chúng ta sử dụng lớp nhập xuất OjectOutputStream để ghi đối tượng X lên tập tin, khi đó toàn bộ 50 đối tượng liên kết với nó cũng được ghi vào tập tin đó. Giả sử một thời gian sau, ta muốn sử dụng lại đối tượng X, ta có thể đọc và khôi phục lại đối tượng từ tập tin objects.dat như sau:
// ReadObjectApp.java
import java.io.*; class ReadObjectApp {
public static void main (String args[]) { try {
ObjectInputStream in = new ObjectInputStream (
new FileInputStream (“objects.dat”));
// đọc đối tượng từ tập tin
LinkObject X = (LinkObject) new in.readObject();
// in nội dung của đối tượng lên màn hình
System.out.println(“Here is X” + X); while ((X = X.next) != null)
System.out.println(X); }
catch (ClassNotFoundException d) { System.out.println(d);} catch (IOException e) { System.out.println(e);}
}
Thực thi chương trình:
……….
Như ta thấy, chương trình ReadObjectApp không dùng lệnh new để tạo đối tượng mà sử dụng lớp ObjectInputStream để đọc đối tượng từ tệp trên đĩa.
Nếu không cài đặt giao diện Serializable cho đối tượng LinkObject thì quá trình biên dịch vẫn thành công nhưng khi thực thi sẽ xảy ra lỗi như sau:
Khả năng tuần tự hóa của đối tượng rất hữu dụng. Hầu như nó làm nền tảng và được dùng xuyên suốt trong cơ chế hoạt động truyền dữ liệu kiểu đối tượng trong máy ảo Java và giữa những máy ảo Java trên mạng.