TUẦN TỰ HÓA (SERIALIZABLE) ĐỐI TƯỢNG

Một phần của tài liệu TÌM HIỂU KỸ THUẬT LẬP TRÌNH PHÂN TÁN TRONG JAVA (Trang 37 - 41)

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 ( (adsbygoogle = window.adsbygoogle || []).push({});

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.

Một phần của tài liệu TÌM HIỂU KỸ THUẬT LẬP TRÌNH PHÂN TÁN TRONG JAVA (Trang 37 - 41)