http://vietjack.com/java/index.jsp Copyright © vietjack.com Serialization Java Java cung cấp kỹ thuật, gọi serialization đối tượng (object serialization), đối tượng biểu diễn dãy byte liên tục mà bao gồm liệu đối tượng thông tin kiểu đối tượng kiểu liệu lưu giữ đối tượng Sau đối tượng serialize ghi vào file, đọc từ file deserialize từ đó, thơng tin kiểu byte mà biểu diễn đối tượng liệu sử dụng để tái tạo đối tượng nhớ Ấn tượng toàn tiến trình JVM độc lập, nghĩa đối tượng xếp thứ tự (serialize) platform deserialize platform hoàn toàn khác Các lớp ObjectInputStream ObjectOutputStream Java luồng bậc cao mà chứa phương thức để serialize deserialize đối tượng Lớp ObjectOutputStream chứa nhiều phương thức write để ghi kiểu liệu đa dạng, với phương thức đầu chuẩn cụ thể: public final void writeObject(Object x) throws IOException Phương thức xếp thứ tự Object theo thứ tự gửi tới đầu chuẩn Tương tự, lớp ObjectInputStream chứa phương thức sau để deserialize đối tượng: public final Object readObject() throws IOException, ClassNotFoundException Phương thức thu nhận Object khỏi luồng deserialize Giá trị trả Object, bạn cần ép thành kiểu liệu thích hợp Để minh họa cách serialization làm việc Java, sử dụng lớp Employee mà bàn luận chương trước Giả sử có lớp Employee sau, mà triển khai Serializable Interface: public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } } Ghi rằng, với lớp để xếp thứ tự theo thứ tự cách thành cơng, phải có hai điều kiện sau: Lớp phải triển khai java.io.Serializable interface Tất trường lớp phải xếp thứ tự (Serializable) Nếu trường xếp thứ tự, phải đánh dấu Nếu bạn tò mò để biết: lớp Java chuẩn xếp thứ tự không, bạn kiểm tra văn kiện cho lớp Việc kiểm tra đơn giản: Nếu lớp triển khai java.io.Serializable interface Serializable, khơng khơng thể xếp thứ tự Xếp thứ tự Object Java Lớp ObjectOutputStream sử dụng để xếp thứ tự Object Chương trình SerializeDemo sau thuyết minh đối tượng Employee xếp thứ tự vào file Khi chương trình thực thi, file với tên employee.ser tạo Chương trình khơng tạo đầu nào, bạn xem xét code cố gắng xác định xem chương trình làm Chú ý: Khi xếp thứ tự đối tượng vào file, qui ước chuẩn Java cung cấp file có ser import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); }catch(IOException i) { i.printStackTrace(); } } } Deserialize Object Java Chương trình DeserializeDemo sau deserialize đối tượng Employee tạo chương trình SerializeDemo Bạn xem xét chương trình xác định đầu nó: import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com e = (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: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } } Nó cho kết sau: Deserialized Employee Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: Number:101 Dưới số điểm quan trọng cần ghi nhớ: Khối try/catch cố gắng để bắt ClassNotFoundException, khai báo phương thức readObject() Với JVM để deserialize đối tượng, phải tìm thấy bytecode cho lớp Nếu JVM khơng thể tìm lớp deserialize đối tượng, ném ClassNotFoundException http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com Chú ý giá trị trả readObject ném tới tham chiếu Employee Giá trị trường SSN 11122333 đối tượng xếp thứ tự, trường tạm thời (transient), giá trị không gửi tới luồng đầu Trường SSN đối tượng Employee deserialize http://vietjack.com/ Trang chia sẻ học online miễn phí Page ... ObjectInputStream in = new ObjectInputStream(fileIn); http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com /java/ index.jsp Copyright © vietjack.com e = (Employee) in.readObject(); in.close();... đối tượng, ném ClassNotFoundException http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com /java/ index.jsp Copyright © vietjack.com Chú ý giá trị trả readObject ném... chuẩn Java cung cấp file có ser import java. io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); http://vietjack.com/ Trang chia sẻ học online