JavaRush /Blog Java /Random-VI /Giao diện - đánh dấu
dupliaka
Mức độ
Санкт-Петербург

Giao diện - đánh dấu

Xuất bản trong nhóm
Giao diện điểm đánh dấu là một mẫu thiết kế có tính năng kiểm tra loại thời gian chạy cho phép bạn liên kết giao diện và lớp. Để hiểu tại sao điều này có thể cần thiết, hãy xem xét một ví dụ về việc đánh dấu lớp Serializible bằng một điểm đánh dấu. Giả sử rằng chúng ta cần lưu trạng thái của một đối tượng trong bộ nhớ và sau đó cũng có thể giải mã những gì chúng ta đã lưu. Sau đó, bạn nói, chúng ta có thể chuyển đổi đối tượng của mình thành một tập hợp các bit. Phải. Chúng ta có thể sử dụng một cách đơn giản để ghi vào tệp bằng FileInputStream, nhưng cách này chỉ thuận tiện nếu có ít đối tượng, còn nếu có nhiều đối tượng thì sao? Có một công cụ tuần tự hóa tuyệt vời cho việc này. Nguyên tắc chính khi bạn sử dụng nó là đối tượng được tuần tự hóa phải chứa tất cả dữ liệu và không tham chiếu đến các đối tượng khác. Hãy nhìn vào lớp của bạn “Aha, các trường không được tham chiếu và thật tốt khi đặt điểm đánh dấu Có thể tuần tự hóa”. Và khi bạn đặt nó, điều đó sẽ có nghĩa là các đối tượng mà bạn đánh dấu có thể được ghi vào ObjectOutputStream. Lớp ObjectOutputStream có một phương thức writeObject0() và nó chứa các kiểm tra instanceof để kiểm tra xem đối tượng có thể được ghi hay không và nếu toàn bộ chuỗi kiểm tra không thành công thì một ngoại lệ NotSerializableException sẽ được ném ra và nếu không, mọi thứ sẽ được ghi gọn gàng vào bộ nhớ. Hãy tạo một lớp BigObject, các phiên bản mà chúng ta sẽ tuần tự hóa. package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } Lớp BigObject đã được đánh dấu là Có thể tuần tự hóa. Nó có một trường id và các phương thức get/set kèm theo. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); 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(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

Ghi lại một đối tượng

Đầu tiên, chúng ta tạo một đối tượng thuộc lớp BigObject có thể tuần tự hóa, sau đó chúng ta chuẩn bị bộ đệm dữ liệu cho nó - nơi chúng ta sẽ đặt tất cả các cung ByteArrayOutputStream. Sau đó, chúng ta chuẩn bị ObjectOutputStream đã được đề cập và chuyển bộ đệm vào đó, ghi đối tượng của mình vào luồng và đóng nó.

Đọc một đối tượng

Hãy chuẩn bị một bộ đệm ghi readBuffer, truyền inputStream, đọc readObject(). Đối tượng hiện đã được khôi phục. Nhờ trường `id` không phải là một liên kết, chúng tôi có thể đánh dấu lớp Serializable, lớp này chứa hoàn toàn dữ liệu của nó. Thay vì thêm các hàm xác thực bên trong lớp, mã thông báo cho phép chúng ta đơn giản hóa quá trình xác thực lớp.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION