JavaRush /Blog Java /Random-VI /Tại sao nên sử dụng SerialVersionUID bên trong lớp Serial...
0xFF
Mức độ
Донецк

Tại sao nên sử dụng SerialVersionUID bên trong lớp Serializable trong Java

Xuất bản trong nhóm
SerializationSerialVersionUIDluôn là một bí ẩn đối với nhiều nhà phát triển Java. Tôi thường thấy các câu hỏi về SerialVersionUID, hoặc điều gì sẽ xảy ra nếu tôi không khai báo SerialVersionUIDtrong Serializablelớp - của mình? Tại sao nên sử dụng SerialVersionUID bên trong lớp Serializable trong Java - 1Ngoài việc gây nhầm lẫn và ít được sử dụng, một lý do khác cho câu hỏi này là cảnh báo thiếu của Eclipse IDE SerialVersionUID, ví dụ: " The Serializable class Customer không khai báo trường SerialVersionUID tĩnh cuối cùngSerializable thuộc Customerloại SerialVersionUIDdài " Trong bài viết này, bạn sẽ không chỉ tìm hiểu những điều cơ bản về Java SerialVersionUIDmà còn tìm hiểu tác động của nó đối với quá trình tuần tự hóa và giải tuần tự hóa. Khi bạn khai báo một lớp, bằng Serializablecách triển khai giao diện mã thông báo java.io.Serializable, thời gian chạy Java sẽ lưu trữ một phiên bản của lớp đó trên đĩa bằng cơ chế tuần tự hóa mặc định trừ khi bạn định cấu hình quy trình để sử dụng giao diện Có thể bên ngoài . Trong quá trình tuần tự hóa, bộ thực thi Java tạo ra một số phiên bản cho lớp để nó có thể giải tuần tự hóa nó sau này. Trong Java, số phiên bản này được gọi là SerialVersionUID. Nếu trong quá trình khử lưu huỳnh SerialVersionUIDkhông có kết quả khớp thì quy trình sẽ thoát ra với một ngoại lệ InvalidClassExceptiontrong luồng " main" java.io.InvalidClassExceptionvà cũng sẽ in tên lớp và tệp SerialVersionUID. Một giải pháp nhanh chóng để khắc phục vấn đề này là sao chép SerialVersionUIDvà định nghĩa nó như một hằng số kiểu private static final longtrong lớp của bạn. Trong bài viết này, chúng ta sẽ tìm hiểu lý do tại sao chúng ta nên sử dụng SerialVersionUIDJava và cách sử dụng công cụ JDK nối tiếp để tạo ID này. Nếu bạn chưa quen với việc tuần tự hóa, bạn cũng có thể xem Top 10 câu hỏi phỏng vấn về tuần tự hóa Java để đánh giá kiến ​​thức của bạn và tìm ra những lỗ hổng trong hiểu biết của bạn để đọc thêm. Giống như Concurrency(đồng thời) và Multi-threading(đa luồng), Serialization(tuần tự hóa) là một chủ đề khác đáng được đọc nhiều lần.

Tại sao nên sử dụng SerialVersionUID trong Java

Như tôi đã nói, khi chúng ta chưa xác định một giá trị SerialVersionUIDnhư static final longtrong lớp của mình, cơ chế tuần tự hóa sẽ thực hiện việc đó cho chúng ta. Cơ chế này nhạy cảm với nhiều chi tiết, bao gồm các trường trong lớp của bạn, bộ sửa đổi truy cập của chúng, các giao diện mà nó triển khai và thậm chí cả các cách triển khai trình biên dịch khác nhau; bất kỳ thay đổi nào đối với lớp hoặc việc sử dụng một trình biên dịch khác có thể tạo ra một kết quả khác, SerialVersionUIDcuối cùng sẽ dẫn đến kết quả khác. ngăn chặn việc tải lại dữ liệu được tuần tự hóa. Thật nguy hiểm khi dựa vào cơ chế tuần tự hóa của Java để tạo id này, đó là lý do tại sao bạn nên xác định rõ ràng nó SerialVersionUIDtrong lớp Serializable của mình . Tôi đặc biệt khuyên bạn nên đọc cuốn sách Java cổ điển - Joshua Bloch “Java hiệu quả” để hiểu về tuần tự hóa Java và các vấn đề khi xử lý chúng không chính xác. Nhân tiện, JDK cũng cung cấp một công cụ serialver, nằm trong thư mục bin của thư mục JAVA_HOME , trên máy tính của tôi, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , có thể được sử dụng để tạo SerialVersionUIDcho lớp cũ. Điều này rất hữu ích trong trường hợp bạn đã thực hiện các thay đổi đối với lớp của mình làm hỏng quá trình tuần tự hóa và ứng dụng của bạn không thể tải lại các phiên bản được tuần tự hóa. Bạn có thể dễ dàng sử dụng tiện ích này để tạo SerialVersionUIDcác phiên bản cũ và sau đó sử dụng nó một cách rõ ràng bằng cách khai báo trường là private static Final long SerialVersionUID . Nhân tiện, vì lý do hiệu suất và bảo mật nên sử dụng định dạng nhị phân thông thường để tuần tự hóa; một lần nữa, “Java hiệu quả” có một số đoạn thể hiện rất chi tiết những ưu điểm của định dạng thông thường.

Cách sử dụng tiện ích JDK của serialver để tạo SerialVersionUID

Bạn có thể sử dụng serialverđể tạo SerialVersionUIDcho các lớp. Điều này đặc biệt hữu ích cho việc phát triển các lớp; tiện ích trả về SerialVersionUIDở định dạng dễ sao chép. Bạn có thể sử dụng serialvertiện ích JDK như trong ví dụ:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Bạn cũng có thể sử dụng tiện ích này serialvernhư GUImột lệnh $ serialver –show, thao tác này sẽ mở một trình kiểm tra serial versionlấy tên lớp đầy đủ và hiển thị nó Serial version.

Bản tóm tắt

Bây giờ chúng ta đã biết nó là gì SerialVersionUIDvà tại sao việc khai báo nó trong một Serializable-class lại quan trọng, đã đến lúc xem lại một số thông tin quan trọng liên quan đến Java SerialVersionUID.
  1. SerialVersionUIDđược sử dụng để chỉ ra phiên bản của dữ liệu được tuần tự hóa.

  2. Khi chúng ta không khai báo SerialVersionUIDtrong lớp của mình, thời gian chạy Java sẽ thực hiện điều đó cho chúng ta, nhưng quy trình này rất nhạy cảm với nhiều siêu dữ liệu của lớp bao gồm số lượng trường, loại trường, công cụ sửa đổi truy cập trường, giao diện được triển khai trong lớp , v.v. Bạn có thể tìm thấy thông tin chính xác trong tài liệu Serialization của Oracle.

  3. Bạn nên khai báo SerialVersionUID là biến dài cuối cùng tĩnh riêng tư để tránh cơ chế mặc định. Một số IDE, chẳng hạn như Eclipse , cũng đưa ra cảnh báo nếu bạn quên điều này, ví dụ: "The Serializable class Customer không khai báo trường SerialVersionUID tĩnh cuối cùng thuộc loại dài." . Mặc dù bạn có thể tắt cảnh báo này bằng cách đi tới Cửa sổ > Tùy chọn > Java > Trình biên dịch > Lỗi/Cảnh báo > Sự cố lập trình tiềm ẩn, nhưng tôi khuyên bạn không nên làm như vậy. Chỉ khi không cần phục hồi dữ liệu thì tôi mới có thể bất cẩn. Đây là lỗi trong Eclipse IDE, tất cả những gì bạn cần làm là đưa ra quyết định nhanh chóng đầu tiên. Tại sao nên sử dụng SerialVersionUID bên trong lớp Serializable trong Java - 2

  4. Bạn cũng có thể sử dụng tiện ích serialver từ JDK để tạo Phiên bản nối tiếp cho các lớp trong Java. Tiện ích này cũng có GUI, được kích hoạt khi truyền tham số - show.

  5. Cách thực hành tốt nhất trong quá trình tuần tự hóa là khai báo rõ ràng SerialVersionUID, để tránh bất kỳ vấn đề nào với việc hủy tuần tự hóa, đặc biệt nếu bạn đang làm việc với một ứng dụng máy khách-máy chủ dựa trên dữ liệu được tuần tự hóa, chẳng hạn như RMI.
Tất cả đều có SerialVersionUIDtrong Java. SerialVersionUIDBây giờ chúng ta đã biết tại sao việc khai báo chính xác trong lớp lại quan trọng . Bạn có thể cảm ơn IDE của mình vì lời nhắc này, điều này có khả năng phá vỡ quá trình khử tuần tự hóa lớp của bạn. Nếu bạn muốn đọc thêm về tuần tự hóa và các khái niệm liên quan, bạn cũng có thể xem các bài viết tuyệt vời này. Bản gốc ở đây
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION