Giao diện đánh dấu và bản sao sâu - 1

"Chào, Amigo!"

"Chào, Bilaabo!"

"Hôm nay tôi sẽ cho bạn biết về giao diện đánh dấu ."

"Giao diện đánh dấu là giao diện không có phương thức. Khi một lớp triển khai giao diện như vậy, chúng tôi nói rằng nó được đánh dấu bởi giao diện đó."

"Ví dụ về các giao diện này bao gồm: Cloneable, Serializable, Remote ."

" Giao diện Serializable được sử dụng để đánh dấu các lớp hỗ trợ tuần tự hóa, cho biết rằng các phiên bản của các lớp này có thể được tự động tuần tự hóa và giải tuần tự hóa."

" Giao diện từ xa được sử dụng để xác định các đối tượng hỗ trợ thực thi từ xa, tức là các phương thức có thể được gọi từ một máy ảo Java khác và/hoặc máy tính khác."

" Giao diện Cloneable được sử dụng để đánh dấu các lớp hỗ trợ nhân bản."

"Ồ, về nhân bản, hoặc sao chép."

"Có hai loại sao chép: nông và sâu."

" Sao chép nông đang tạo một bản sao của một đối tượng mà không tạo các bản sao của bất kỳ đối tượng nào mà nó tham chiếu."

" Sao chép sâu liên quan đến việc sao chép một đối tượng, bao gồm các đối tượng mà nó tham chiếu và các đối tượng mà các đối tượng đó tham chiếu, v.v."

"Có một cách thực sự tốt để tạo một bản sao sâu một cách đáng tin cậy."

"Phương pháp này hoạt động ngay cả khi các nhà phát triển đã quên đánh dấu một lớp là Có thể sao chép. "Yêu cầu duy nhất là các đối tượng phải được tuần tự hóa."

"Đây là cách bạn làm điều đó:"

1) Tạo bộ đệm (mảng byte) trong bộ nhớ.

2) Nối tiếp đối tượng và các đối tượng con vào bộ đệm.

3) Giải tuần tự hóa hệ thống phân cấp đối tượng được lưu trong bộ đệm.

Mã số
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

"Trong dòng đầu tiên, chúng tôi tạo objectOriginal , mà chúng tôi sẽ sao chép. Đối tượng và tất cả các đối tượng con của nó phải hỗ trợ tuần tự hóa."

"Ở dòng thứ ba, chúng tôi tạo ByteArrayOutputStream , sẽ tự động mở rộng khi dữ liệu mới được thêm vào (như ArrayList)."

"Trong dòng 4, chúng tôi tạo một ObjectOutputStream , được sử dụng để tuần tự hóa."

"Trong dòng 5, chúng tôi tuần tự hóa objectOriginal thành một mảng byte bằng cách sử dụng outputStream và lưu nó vào writeBuffer ."

"Trong dòng 8, chúng tôi chuyển đổi writeBuffer thành một mảng byte thông thường. Sau đó, chúng tôi sẽ 'đọc' đối tượng mới của mình từ mảng này."

"Trong dòng 9, chúng tôi chuyển đổi bộ đệm thành ByteArrayInputStream để đọc từ nó như một InputStream."

"Trong dòng 10, chúng tôi chuyển readBuffer tới hàm tạo ObjectInputStream để đọc (giải tuần tự hóa) đối tượng."

"Trong dòng 11, chúng tôi đọc đối tượng của mình và chuyển đổi nó thành BigObject ."

"Bạn nghĩ sao?"

"Nó thật đẹp."

"Và nhân tiện, khi mã được đánh dấu bằng các màu khác nhau, nó sẽ dễ hiểu hơn nhiều."