Chúng ta có thể tuần tự hóa một lớp bên trong tĩnh trong Java không? Bản thân lớp được khai báo là tĩnh ở đây.Nối tiếp lớp tĩnh bên trong
Trả lời
Lớp bên trong tĩnh không khác với lớp cấp cao nhất về mặt này: nó có thể được tuần tự hóa nếu được khai báo để triển khai Serializable
(hoặc là lớp con của lớp được khai báo để triển khai Serializable
). Ngoài ra, như với các lớp cấp cao nhất, tất cả các đối tượng gặp phải trong quá trình tuần tự hóa tại thời gian chạy phải được tuần tự hóa để tránh một số NotSerializableException
. Vì lớp bên trong là static
, bản chất của lớp ngoài không liên quan đến điều này.
Cảm ơn tất cả các bạn. Tôi có những gì tôi cần từ mọi người. – Tinkerbel
Dường như câu trả lời có thể thay đổi theo phiên bản Java ngay bây giờ.
Các spec serialization trong JDK 7 cho biết:
Note - serialization các lớp bên trong (ví dụ, các lớp lồng nhau mà không phải là lớp học thành viên tĩnh), bao gồm các lớp học địa phương và vô danh, không được khuyến khích mạnh mẽ vì nhiều lý do. Bởi vì các lớp bên trong được khai báo trong các ngữ cảnh không tĩnh chứa các tham chiếu không tạm thời tiềm ẩn để bao bọc các cá thể lớp, việc tuần tự hóa một cá thể lớp bên trong sẽ dẫn đến việc tuần tự hóa thể hiện lớp bên ngoài của nó. Các trường tổng hợp được tạo ra bởi javac (hoặc các trình biên dịch JavaTM khác) để thực hiện các lớp bên trong được thực hiện phụ thuộc và có thể khác nhau giữa các trình biên dịch; sự khác biệt trong các trường như vậy có thể làm gián đoạn khả năng tương thích cũng như dẫn đến xung đột giá trị serialVersionUID mặc định. Các tên được gán cho các lớp bên trong nội bộ và ẩn danh cũng phụ thuộc vào việc triển khai thực hiện và có thể khác nhau giữa các trình biên dịch. Vì các lớp bên trong không thể khai báo các thành viên tĩnh ngoài các trường hằng số biên dịch, chúng không thể sử dụng cơ chế serialPersistentFields để chỉ định các trường tuần tự. Cuối cùng, bởi vì các lớp bên trong kết hợp với các cá thể bên ngoài không có các hàm tạo đối số bằng không (các hàm tạo của các lớp bên trong ngầm chấp nhận trường hợp kèm theo như một tham số được thêm vào), chúng không thể thực hiện Externalizable. Tuy nhiên, không có vấn đề nào được liệt kê ở trên, áp dụng cho các lớp thành viên tĩnh.
và từ trải nghiệm sắp xếp các đối tượng giữa phiên bản Oracle và IBM JDK 1.7, tôi có thể cho bạn biết rằng nó không phải lúc nào cũng hoạt động. Tôi không thể nói chắc chắn nó luôn thất bại, nhưng bạn chắc chắn không thể trông cậy vào nó.
Đường dẫn mã không bị lỗi trong ứng dụng của tôi hoạt động tốt trên JDK 1.5 trong 5 năm sản xuất và tôi không thấy gì trong tài liệu trước về tuần tự hóa giống với tuyên bố hiện tại. Vì vậy, có vẻ như các vị thần Java đã được phép mẫu mã này trong JDK 7.
Điều này không liên quan đến câu hỏi, chỉ định các lớp bên trong ** tĩnh **. – gerardw
@Tinkerbel một cái gì đó cần lưu ý -
Serializing lớp lồng nhau tĩnh là tốt nhưng khi (trong tương lai) nếu các lớp bên trong tĩnh là bao giờ di chuyển đến một lớp bên ngoài khác nhau sau đó de serializing các đối tượng cũ là một vấn đề.
Tất cả các trường được gán là mặc định/null.
Sẽ rất hữu ích nếu ai đó có thể giải thích lý do tại sao?Tôi đã quan sát điều đó nhưng tôi không có một lý do rất thuyết phục ... Nghe có vẻ như bất cứ khi nào một gói được thay đổi, điều này sẽ xảy ra – user2674407
Vâng, điều gì xảy ra khi bạn ... thử? –
đơn đăng ký của tôi đang hoạt động tốt khi tôi thực hiện việc này. Nhưng, cho điều này xảy ra tôi đang serializing cả hai lớp bên trong và bên ngoài, đó là không cần thiết cho tôi, nhưng tôi biết khái niệm nếu lớp bên trong được nối tiếp thì bên ngoài phải được nối tiếp. Và ngoài ra, tôi có một số nghi ngờ trong các lớp tĩnh có thể được serialized hay không. – Tinkerbel
Lớp bên ngoài không có gì liên quan đến việc tuần tự hóa lớp bên trong _static_. –