2011-10-12 28 views
6

khi tôi tạo Java Class trong Eclipse mà thực hiện giao diện Serializable, tôi nhận được một cảnh báoLàm thế nào serialVersionUID được tính

Lớp ABCD serializable không khai báo một thức lĩnh vực serialVersionUID tĩnh của loại dài

Vì vậy, khi tôi nhấp vào cảnh báo, tôi nhận được tùy chọn trong Eclipse là

Thêm ID phiên bản nối tiếp được tạo

Khi tôi chọn tùy chọn đó, Eclipse sẽ tự động tạo biến số serialVersionUID cho tôi.

Bây giờ tôi muốn biết rằng trên cơ sở số đó được tạo ra. Nó chỉ là một số ngẫu nhiên? Tôi có thể cung cấp bất kỳ số ngẫu nhiên nào của riêng mình không?

Trả lời

12

Nó được tính dựa trên cấu trúc của lớp - trường, phương pháp, v.v. Nó được chỉ định trong Object Serialization Specification - see this section cho định dạng chính xác.

Thông số mô tả những gì xảy ra không có giá trị nào được cung cấp, nhưng tính năng tự động phát sử dụng cùng một thuật toán.

Trình tự của các mục trong dòng như sau:

  • Tên lớp.
  • Các công cụ sửa đổi lớp được viết dưới dạng số nguyên 32 bit.
  • Tên của từng giao diện được sắp xếp theo tên.
  • Đối với mỗi trường của lớp được sắp xếp theo tên trường (ngoại trừ trường riêng tư tĩnh và riêng tư tạm thời: * Tên trường. * Số công cụ sửa đổi của trường được viết dưới dạng số nguyên 32 bit. * Bộ mô tả của
  • Nếu trình khởi tạo lớp tồn tại, hãy viết như sau: * Tên phương thức,. * Công cụ sửa đổi của phương thức, java.lang.reflect.Modifier.STATIC, được viết dưới dạng số nguyên 32 bit. * Bộ mô tả của phương thức,() V.
  • Đối với mỗi hàm tạo không riêng tư được sắp xếp theo tên phương thức và chữ ký: * Tên phương thức,. * Các công cụ sửa đổi của phương thức được viết dưới dạng số nguyên 32 bit . * Bộ mô tả của phương thức.
  • Đối với mỗi phương thức không riêng tư được sắp xếp theo tên phương thức và chữ ký: * Tên của phương thức. * Các công cụ sửa đổi của phương thức được viết dưới dạng số nguyên 32 bit là . * Bộ mô tả của phương thức.
4

Tự động tạo serialVersionIds là một băm dựa trên chữ ký phương thức, tham số và như trong lớp. Nó được thực hiện theo cách này để serialVersionId sẽ thay đổi bất cứ khi nào bạn thay đổi lớp của bạn, chỉ ra cơ chế tuần tự hóa mà dữ liệu/lớp không còn tương thích nữa. Đó là mặc định.

Khi bạn xác định của riêng mình, chỉ cần bắt đầu bằng 1 và tăng khi lớp không còn tương thích với dữ liệu được tuần tự hóa trước đó.

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