2009-05-18 38 views
8

Nếu một câu hỏi tương tự đã được đăng trên stackoverflow, xin vui lòng chỉ cần đăng liên kết.Tại sao cần thiết để đánh dấu một lớp là có thể tuần tự hóa?

Cần phải triển khai giao diện Serializable (không có phương pháp) cho các đối tượng được sắp xếp theo thứ tự? API Java nói - - Nếu nó không được triển khai thì nó sẽ ném java.io.NotSerializableException.

Đó là bởi vì các đoạn mã sau vào ObjectOutputStream.java

............................ 

writeObject0(Object obj, boolean unshared){ 
............. 
} else if (cl.isArray()) { 
     writeArray(obj, desc, unshared); 
     } else if (obj instanceof Serializable) { 
     writeOrdinaryObject(obj, desc, unshared); 
     } else { 
     throw new NotSerializableException(cl.getName()); 
     } 
................ 

Nhưng câu hỏi của tôi là lý do tại sao cần thiết của nó để thực hiện Serializable và do đó thông báo hoặc báo cho Java/JVM rằng một lớp có thể được đăng. (Là nó chỉ để tránh ngoại lệ?).

Trong trường hợp này, Nếu chúng ta viết một chức năng tương tự ghi đối tượng vào luồng mà không kiểm tra xem lớp trong một instanceOf có thể tuần tự hóa, các đối tượng của lớp không thực hiện tuần tự tuần tự?

Mọi trợ giúp đều được đánh giá cao.

+3

Ngắt của http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface –

+0

[Câu hỏi này] (http://stackoverflow.com/questions/441196/why-java-needs- serializable-interface) có một số câu trả lời hay cho điều này. – jwoolard

Trả lời

4

Đó là một câu hỏi hay. Serializable được biết như là một marker interface, và có thể được xem như là một thẻ trên một lớp để xác định nó là có khả năng hoặc hành vi. ví dụ. bạn có thể sử dụng điều này để xác định các lớp mà bạn muốn serialize mà không có serialVersionUid được xác định (và điều này có thể là một lỗi).

Lưu ý rằng thư viện xê-ri hóa thường được sử dụng XStream (và những thứ khác) không yêu cầu phải định nghĩa được Serializable.

2

Điều này là cần thiết để JVM có thể biết liệu một lớp học có thể được sắp xếp một cách an toàn hay không. Một số điều (các kết nối cơ sở dữ liệu ví dụ) chứa trạng thái hoặc các kết nối đến các tài nguyên bên ngoài mà thực sự không thể được tuần tự hóa.

Ngoài ra, bạn sẽ muốn chắc chắn rằng bạn đặt một viên serialVersionUID trong mỗi lớp serializable để đảm bảo rằng đối tượng serialized có thể được de-đăng sau khi thay đổi mã hoặc biên dịch lại:

// Set to some arbitrary number. 
// Change if the definition/structure of the class changes. 
private static final long serialVersionUID = 1; 
0

Lý do là không phải tất cả các lớp đều có thể được tuần tự hóa. Ví dụ:

  • I/O stuff: InputStream, kết nối HTTP, kênh. Chúng phụ thuộc vào các đối tượng được tạo ra bên ngoài phạm vi của máy ảo Java và không có cách nào đơn giản để khôi phục chúng.

  • nguồn OS như cửa sổ, hình ảnh, vv

2

Các serialization cho phép bạn lưu các đối tượng trực tiếp đến tập tin nhị phân mà không cần phải phân tích chúng để nhắn tin, viết chuỗi ra ngoài và sau đó tạo ra một đối tượng mới , và phân tích các đầu vào chuỗi khi đọc lại. Mục đích chính là cho phép bạn lưu các đối tượng với tất cả dữ liệu của chúng vào một tệp nhị phân. Tôi thấy nó cực kỳ hữu ích khi phải làm việc với các danh sách liên kết chứa nhiều đối tượng cùng loại và tôi cần phải lưu chúng và mở chúng.

+0

Đó là câu trả lời cho câu hỏi "Tại sao serialization lại hữu ích?" –

+0

Nhưng nó cũng trả lời tại sao bạn phải đánh dấu nó là serializable để sử dụng các tập tin nhị phân và để viết/đọc các đối tượng. – FloppyDisk

Các vấn đề liên quan