Thứ Bảy, 23 tháng 2, 2019

Học lập trình Java - Java - Tuần tự hóa

Học lập trình Java cung cấp một cơ chế, được gọi là tuần tự hóa đối tượng trong đó một đối tượng có thể được biểu diễn dưới dạng một chuỗi byte bao gồm dữ liệu của đối tượng cũng như thông tin về loại đối tượng và các loại dữ liệu được lưu trữ trong đối tượng.

Sau khi một đối tượng được tuần tự hóa đã được ghi vào một tệp, nó có thể được đọc từ tệp và được giải tuần tự, đó là thông tin loại và byte đại diện cho đối tượng và dữ liệu của nó có thể được sử dụng để tạo lại đối tượng trong bộ nhớ.

Học lập trình Java chuyên nghiệp
Học lập trình Java chuyên nghiệp

Ấn tượng nhất là toàn bộ quá trình là độc lập JVM, có nghĩa là một đối tượng có thể được tuần tự hóa trên một nền tảng và được giải tuần tự hóa trên một nền tảng hoàn toàn khác.

Các lớp ObjectInputStream và ObjectOutputStream là các luồng mức cao có chứa các phương thức để tuần tự hóa và giải tuần tự hóa một đối tượng.

Lớp ObjectOutputStream chứa nhiều phương thức ghi để ghi các loại dữ liệu khác nhau, nhưng một phương thức đặc biệt nổi bật

public final void writeObject(Object x) throws IOException

Phương thức trên nối tiếp một đối tượng và gửi nó đến luồng đầu ra. Tương tự, lớp ObjectInputStream chứa phương thức sau đây để giải tuần tự hóa một đối tượng

public final Object readObject() throws IOException, ClassNotFoundException

Phương thức này lấy ra đối tượng tiếp theo ra khỏi luồng và giải tuần tự hóa nó. Giá trị trả về là Object, vì vậy bạn sẽ cần chuyển nó thành kiểu dữ liệu phù hợp.

Để giải thích cách tuần tự hóa hoạt động trong Học lập trình Java, tôi sẽ sử dụng lớp Nhân viên mà chúng ta đã thảo luận sớm trong cuốn sách. Giả sử rằng chúng ta có lớp Nhân viên sau, thực hiện giao diện Nối tiếp
public class Employee implements java.io.Serializable {
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   
   public void mailCheck() {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}
Lưu ý rằng để một lớp được nối tiếp thành công, phải đáp ứng hai điều kiện

Lớp phải thực hiện giao diện java.io.Serializable.

Tất cả các trường trong lớp phải được tuần tự hóa. Nếu một trường không được tuần tự hóa, nó phải được đánh dấu thoáng qua .

Nếu bạn tò mò muốn biết liệu Lớp Tiêu chuẩn Học lập trình Java có được tuần tự hóa hay không, hãy kiểm tra tài liệu cho lớp. Bài kiểm tra rất đơn giản: Nếu lớp thực hiện java.io.Serializable, thì nó có khả năng tuần tự hóa; mặt khác, nó không phải là.

Nối tiếp một đối tượng


Lớp ObjectOutputStream được sử dụng để tuần tự hóa một Object. Chương trình serializeDemo sau đây khởi tạo một đối tượng Nhân viên và tuần tự hóa nó thành một tệp.

Khi chương trình được thực thi xong, một tệp có tên worker.ser được tạo. Chương trình không tạo ra bất kỳ đầu ra nào, nhưng nghiên cứu mã và cố gắng xác định chương trình đang làm gì.

Lưu ý - Khi tuần tự hóa một đối tượng thành một tệp, quy ước chuẩn trong Học lập trình Java là cung cấp cho tệp một phần mở rộng .ser .
import java.io.*;
public class SerializeDemo {

   public static void main(String [] args) {
      Employee e = new Employee();
      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();
      }
   }
}

Giải trừ một đối tượng

Chương trình DeserializeDemo sau đây sẽ giải tuần tự hóa đối tượng Nhân viên được tạo trong chương trình SerializeDemo. Nghiên cứu chương trình và cố gắng xác định đầu ra của nó -

Thí dụ
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);
         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);
   }
}

Điều này sẽ tạo ra kết quả sau

Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

Dưới đây là những điểm quan trọng cần lưu ý

Khối try / Catch cố gắng bắt ClassNotFoundException, được khai báo bằng phương thức readObject (). Để một JVM có thể giải tuần tự hóa một đối tượng, Học lập trình Java nó phải có khả năng tìm mã byte cho lớp. 

Nếu JVM không thể tìm thấy một lớp trong quá trình khử tuần tự hóa một đối tượng, nó sẽ ném ClassNotFoundException.

Lưu ý rằng giá trị trả về của readObject () được chuyển thành tham chiếu Nhân viên.

Giá trị của trường SSN là 11122333 khi đối tượng được tuần tự hóa, nhưng vì trường này là nhất thời, giá trị này không được gửi đến luồng đầu ra. Trường SSN của đối tượng Nhân viên được khử lưu lượng là 0.

Không có nhận xét nào:

Đăng nhận xét

Lập trình Java - Ngoại lệ

Một ngoại lệ (hoặc sự kiện đặc biệt) là một vấn đề phát sinh trong quá trình thực hiện chương trình. Khi xảy ra Ngoại lệ , luồng bình thường...