"Bạn có nhớ rằng hôm nay chúng ta đã nghiên cứu việc lưu các đối tượng vào và đọc chúng từ một tệp không?"

"Có, chúng tôi vừa lưu vào luồng đầu ra, một lần đọc từ luồng đầu vào."

"Làm tốt lắm, Amigo. Thật tốt khi biết rằng bạn đang chú ý đến những chi tiết này. Bạn có thể hoàn thành mã để nó lưu vào và đọc từ một tệp không?"

"Hoàn thành cái gì?! Khai báo một FileInputStream và FileOutputStream và chuyển chúng đến các phương thức lưu và tải. Không có gì phải nhầm lẫn ở đây cả. Cực kỳ đơn giản."

"Tôi mừng cho bạn. Bây giờ là một chủ đề mới: tuần tự hóa ."

Tuần tự hóa gần giống như những gì chúng ta vừa làm, nhưng thú vị hơn nhiều và được tích hợp ngay vào máy Java. Máy Java có thể lưu trữ và tải các đối tượng của nó. Nó thậm chí không cần các phương thức lưu và tải để làm điều đó: Tất cả các đối tượng được lưu trữ bên trong máy Java và nó có toàn quyền truy cập vào chúng."

Chúng tôi chỉ lấy đối tượng và lưu nó vào luồng và đọc từ luồng:

Mã số
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"Đó là nó?"

"Chính xác. Có một cơ chế tuần tự hóa rất lớn và phức tạp cho phép chúng tôi lưu vào luồng và đọc từ luồng của hầu hết mọi loại dữ liệu."

"Hầu như bất kỳ. Vì vậy, không phải bất kỳ loại dữ liệu?"

"Vâng, thực tế là không phải tất cả các đối tượng đều có khả năng lưu trữ vốn có . Một số đối tượng không lưu trữ tất cả dữ liệu của chúng bên trong. Thay vào đó, chúng chỉ tham chiếu đến các đối tượng và/hoặc nguồn dữ liệu khác. Ví dụ: bảng điều khiển (System. in), luồng đầu vào (InputStream) và những thứ khác."

Đó là lý do tại sao những người tạo ra Java đã đưa ra điểm đánh dấu giao diện Serializable đặc biệt . Nó được gọi là điểm đánh dấu vì nó không chứa bất kỳ dữ liệu và phương thức nào. Nó chỉ được sử dụng để "gắn thẻ" hoặc "đánh dấu" các lớp. Nếu chúng tôi tin rằng lớp của chúng tôi lưu trữ tất cả dữ liệu của nó bên trong, thì chúng tôi có thể đánh dấu nó bằng các triển khai Serializable .

Đây là một ví dụ «mèo» có hỗ trợ tuần tự hóa:

Mã số
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Khi chúng tôi cố gắng tuần tự hóa (lưu) một đối tượng, máy Java sẽ kiểm tra xem nó có hỗ trợ tuần tự hóa hay không: Nó có triển khai giao diện Serializable không? Nếu có, thì nó sẽ lưu đối tượng. Nếu không, nó sẽ đưa ra một ngoại lệ để chỉ ra rằng việc tuần tự hóa là không thể.
Ở đây bạn cần hiểu rằng một đối tượng có thể tuần tự hóa chỉ được bao gồm các đối tượng có thể tuần tự hóa.

"Chà, điều đó có lý. Bạn không thể cứu toàn bộ mà không cứu các bộ phận của nó."

"Chính xác."

"Còn ints, Strings và ArrayLists thì sao?"

"Tất cả chúng đều hỗ trợ tuần tự hóa. Những người tạo ra Java đã đặc biệt quan tâm để đảm bảo điều này xảy ra. Sẽ không có bất kỳ vấn đề nào ở đây."

Ngoài ra, loại đối tượng được lưu khi đối tượng được đánh số thứ tự. Bây giờ bạn có thể lưu tham chiếu đến đối tượng Cat trong biến Đối tượng. Mọi thứ sẽ tuần tự hóa và giải tuần tự hóa tốt.

"Khử lưu huỳnh?"

" Deserialization là quá trình đảo ngược tuần tự hóa: đọc và xây dựng lại đối tượng từ luồng/tệp."

"À, vậy thì không hỏi nữa."