IntelliJ IDEA tạo serialVersionUID


297

Làm thế nào để tạo ra giá trị này trong IntelliJ IDEA?

Tôi đi tới Cài đặt -> Lỗi -> Sự cố nối tiếp -> Lớp tuần tự hóa mà không có 'serialVersionUID', nhưng nó vẫn không hiển thị cho tôi cảnh báo. Lớp cha PKladrBuild của tôi thực hiện giao diện Nối tiếp .

Một phần của mã:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
Bạn có chắc chắn cần tạo một giá trị, thay vì xác định giá trị của riêng bạn? Nếu bạn đang tạo một lớp mới, tôi khuyên bạn nên xác định ví dụ 1Lnhư ID của mình và tăng dần khi biểu mẫu nối tiếp của bạn thay đổi. (Xem stackoverflow.com/questions/888335/ - ).
Duncan Jones

1
stackoverflow.com/questions/24573643/ có một giải pháp rất tốt.
Pankaj Kumar

Câu trả lời:


588

Tôi không chắc liệu bạn có phiên bản cũ của IntelliJ IDEA hay không, nhưng nếu tôi vào menu TệpCài đặt ...Kiểm tra → Sự cố nối tiếp → Lớp tuần tự hóa mà không bật 'serialVersionUID'`, lớp bạn cung cấp cho tôi cảnh báo.

Nhập mô tả hình ảnh ở đây

Nếu tôi thử lớp đầu tiên tôi thấy:

Nhập mô tả hình ảnh ở đây

BTW: Nó không hiển thị cho tôi cảnh báo cho đến khi tôi thêm vào { }cuối mỗi lớp để sửa lỗi biên dịch.


2
Hãy thử File| Invalidate Caches, nếu không được, hãy liên hệ với support@jetbrains.com với một dự án mẫu để sao chép.
CrazyCoder

1
Kiểm tra idea.log(Trợ giúp | Tiết lộ Đăng nhập ...) để biết các trường hợp ngoại lệ, thư mục chính được mã hóa trên Linux được biết là gây ra sự cố do lỗi kernel .
CrazyCoder

1
tôi có rất nhiều ngoại lệ ở đó .. như java.lang.NoClassDefFoundError: org / intellij / lang / annotations / MagicConstant;
Kirill Bazarov

2
Tôi đã cài đặt lại IDEA và gỡ bỏ các trình cắm và nó giúp tôi. Tnx rất nhiều.
Kirill Bazarov

5
Cách tôi làm cho nó hoạt động trong v15 là di chuột qua ClassName để xem cảnh báo và di chuyển chuột từ từ về phía máng xối. Tại thời điểm đó, "bóng đèn" xuất hiện trên màn hình. (Hãy thử điều này một vài lần nếu nó không hoạt động như dự định lần đầu tiên). Sau đó, bạn có thể nhấp vào tùy chọn tạo trường để tạo uid. Hy vọng điều này sẽ giúp những người bị mắc kẹt trên này.
Niyaz

173

Cài đặt plugin GenerateSerialVersionUID của Olivier Descout.

Truy cập: menu TệpCài đặtPluginDuyệt khoGenerateSerialVersionUID

Cài đặt plugin và khởi động lại.

Bây giờ bạn có thể tạo id từ menu Tạo → serialVersionUID` hoặc phím tắt.


14
Có nên yêu cầu một plugin bên ngoài thực sự để làm việc này?
H.Rabiee

Có, bạn cần một plugin đã là một phần của kho lưu trữ plugin IntelliJ.
Sileria

Làm việc cho tôi trên Intellij IDEA 12.1
Sagar Hatekar

Làm việc cho tôi vào ngày 13.0.2.
user1978019

Hoạt động trên Android Studio 0.8.9
Itai Hanski

67

Không có bất kỳ plugin nào: Bạn chỉ cần kích hoạt tính năng tô sáng trong IntelliJ:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'- đặt cờ và nhấp 'OK'.

Bây giờ, nếu lớp của bạn thực hiện Serializable, bạn sẽ thấy phần tô sáng và alt+Entertên lớp sẽ đề xuất để tạo private static final long serialVersionUID.

PS: Lấy từ đây


4
Cảm ơn. Tôi không biết tại sao tôi không nhìn thấy bóng đèn, nhưng nhấp vào tên lớp và gõ Alt-Enter thực hiện mẹo.
John S

2
Câu trả lời bị đánh cắp từ đây
Serhii Maksymchuk

đây là một sự cải tiến hơn
Christian Matthew

39

Sau khi dành một chút thời gian cho Tuần tự hóa, tôi thấy rằng, chúng ta không nên tạo ra serialVersionUIDvới một số giá trị ngẫu nhiên, chúng ta nên cung cấp cho nó một giá trị có ý nghĩa.

Dưới đây là một nhận xét chi tiết về điều này. Tôi đang đối phó với các bình luận ở đây.

Trên thực tế, bạn không nên "tạo" UID phiên bản nối tiếp. Đó là một "tính năng" ngu ngốc bắt nguồn từ sự hiểu lầm chung về cách ID đó được sử dụng bởi Java. Bạn nên cung cấp cho các ID này các giá trị có thể đọc được, có ý nghĩa, ví dụ bắt đầu bằng 1L và tăng chúng mỗi khi bạn nghĩ rằng phiên bản mới của lớp sẽ khiến tất cả các phiên bản trước đó (có thể được tuần tự hóa trước đó) bị lỗi thời. Tất cả các tiện ích tạo ID như vậy về cơ bản làm những gì JVM làm khi ID không được xác định: chúng tạo ra giá trị dựa trên nội dung của tệp lớp, do đó xuất hiện các số nguyên dài vô nghĩa không thể đọc được. Nếu bạn muốn mỗi phiên bản của lớp của bạn là khác biệt (trong mắt của JVM) thì bạn thậm chí không nên chỉ định giá trị serialVersionUID không phải là JVM sẽ tạo ra một cách nhanh chóng, và giá trị của mỗi phiên bản của lớp của bạn sẽ là duy nhất. Mục đích của việc xác định giá trị đó một cách rõ ràng là để nói với cơ chế tuần tự hóa để xử lý các phiên bản khác nhau của lớp có cùng SVUID như thể chúng giống nhau, ví dụ như không từ chối các phiên bản tuần tự cũ hơn. Vì vậy, nếu bạn xác định ID và không bao giờ thay đổi ID (và tôi cho rằng đó là những gì bạn làm vì bạn dựa vào việc tạo tự động và có thể bạn sẽ không bao giờ tạo lại ID của mình), bạn đảm bảo rằng tất cả các phiên bản - thậm chí hoàn toàn khác - lớp học của bạn sẽ được coi là giống nhau bởi cơ chế tuần tự hóa. Đó là điều bạn muốn? Nếu không, và nếu bạn thực sự muốn kiểm soát cách nhận ra các đối tượng của mình, bạn nên sử dụng các giá trị đơn giản mà bản thân bạn có thể hiểu và dễ dàng cập nhật khi bạn quyết định rằng lớp đã thay đổi đáng kể.

Hi vọng điêu nay co ich. Chúc may mắn.


2
Cảm ơn, tôi đã bỏ qua thực tế đơn giản này trong một thời gian dài!
khấu trừ

1
Tôi thực sự sẽ tạo lại serialVersionUIDvới một số ngẫu nhiên mới khi tôi không muốn hỗ trợ các phiên bản cũ về khử lưu huỳnh. Có thể tôi không cần sử dụng số ngẫu nhiên nhưng có thể bắt đầu bằng 1 và tăng nó. Tuy nhiên, sau 3Lđó không có ý nghĩa hơn với tôi -3518231192373568183L. Do đó, tôi đoán cả hai giải pháp đều hoạt động tương tự nhau. Số ngẫu nhiên có thể có lợi thế là nó quét trên lịch sử phi tuyến tính với dĩa và nhánh, mặc dù.
JojOatXGME

16

Để tạo ra giá trị sử dụng

private static final long serialVersionUID = $randomLong$L;
$END$

và cung cấp biến mẫu RandomLong với giá trị sau: groovyScript ("new Random (). nextLong (). abs ()")

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/


1
thích nhận xét này, sử dụng các mẫu trực tiếp, đây chắc chắn là giải pháp nhanh nhất và có thể tùy chỉnh nhiều nhất (ví dụ tôi đã xóa dòng mới). Để định cấu hình, hãy truy cập Android Studio> Tùy chọn> Trình chỉnh sửa> Mẫu trực tiếp và tạo một mẫu mới ở đó (biểu tượng dấu cộng) với giá trị này và sử dụng các biến chỉnh sửa để nhập tập lệnh
hcpl

13

Ngoài ra, bạn có thể thêm mẫu trực tiếp sẽ thực hiện công việc.

Để làm điều đó, nhấn Ctrl+Alt+S-> "Live Templates"phần ->other (hoặc w / e bạn muốn)

Và sau đó tạo một cái mới với định nghĩa như thế này:

private static final long serialVersionUID = 1L;
$END$

Sau đó chọn definitionphạm vi và lưu nó dưới dạng'serial'

Bây giờ bạn có thể gõ serialTABvào lớp cơ thể.


3

Một cách khác để tạo serialVersionUID là sử dụng >Analyze >Run Inspection by Nametừ menu ngữ cảnh (hoặc phím tắt, theo mặc định là ctrl+ alt+ shift+ i) và sau đó nhập "Lớp tuần tự hóa mà không có 'serialVersionUID'" (hoặc chỉ cần gõ "serialVersionUID" và gõ trước chức năng sẽ tìm thấy nó cho bạn.

Ý tưởng> Phân tích> Chạy kiểm tra theo tên Sau đó, bạn sẽ nhận được một menu ngữ cảnh nơi bạn có thể chọn nơi để chạy các kiểm tra (ví dụ: tất cả từ một mô-đun cụ thể, toàn bộ dự án, một tệp, ...)

Với phương pháp này, bạn thậm chí không phải đặt quy tắc kiểm tra chung thành bất cứ điều gì.


Đẹp, điều này đã làm công việc cho tôi. Nó tìm thấy biến còn thiếu và trình bày tùy chọn để thêm nó.
Arenaq

@arenaq vui mừng, điều này đã giúp người khác ;-)
Alexander

2

Với phiên bản v2018.2.1

Đi đến

Tùy chọn> Trình chỉnh sửa> Kiểm tra> Java> Sự cố nối tiếp> chuyển đổi "Lớp tuần tự hóa mà không có 'serialVersionUID'".

Một cảnh báo sẽ xuất hiện bên cạnh khai báo lớp.


1

Tôi đang sử dụng Android Studio 2.1 và tôi có sự thống nhất tốt hơn trong việc lấy bóng đèn bằng cách nhấp vào Tên lớp và di chuột qua nó trong một giây.


1

Thêm một mẫu trực tiếp được gọi là "ser" vào nhóm khác, đặt nó thành "Áp dụng trong Java: khai báo" và bỏ chọn "Rút ngắn tên FQ". Cung cấp cho nó một văn bản mẫu chỉ:

$serial$

Bây giờ chỉnh sửa các biến và đặt nối tiếp thành:

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

Nó giả định bố trí dự án Gradle tiêu chuẩn. Thay đổi / xây dựng / thành / mục tiêu / cho Maven.


1

Phương pháp hiện đại dễ nhất: Alt+ Entertrên

private static final long serialVersionUID = ;

IntelliJ sẽ gạch chân không gian sau =. đặt con trỏ của bạn trên đó và nhấn alt+ Enter( Option+ Entertrên Mac). Bạn sẽ nhận được một popover có nội dung "Thay đổi ngẫu nhiên serialVersionUID Trình khởi tạo". Chỉ cần nhấn enter và nó sẽ điền vào không gian đó một cách ngẫu nhiên.


0

Nếu bạn muốn thêm serialVersionUID vắng mặt cho một loạt các tệp, IntelliJ IDEA có thể không hoạt động tốt. Tôi đưa ra một số kịch bản đơn giản để thực hiện mục tiêu này một cách dễ dàng:

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes

while read f
do
    clazz=${f//\//.}
    clazz=${clazz/%.java/}
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

Bạn lưu tập lệnh này, nói như add_serialVersionUID.shtrong ~/binthư mục của bạn . Sau đó, bạn chạy nó trong thư mục gốc của dự án Maven hoặc Gradle của bạn như:

add_serialVersionUID.sh < myJavaToAmend.lst

.Lst này bao gồm danh sách các tệp Java để thêm serialVersionUID theo định dạng sau:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

Kịch bản lệnh này sử dụng công cụ serialVer JDK. Đó là lý tưởng cho một tình huống khi bạn muốn sửa đổi một số lượng lớn các lớp không có serialVersionUID được đặt ở vị trí đầu tiên trong khi vẫn duy trì khả năng tương thích với các lớp cũ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.