serialVersionUID를 생성하는 IntelliJ IDEA


297

IntelliJ IDEA에서이 값을 어떻게 생성합니까?

내가 이동 설정 -> 오류 -> 직렬화 문제 - '의 serialVersionUID'없이> 직렬화 클래스,하지만 여전히 나에게 경고를 표시하지 않습니다. 내 클래스 PKladrBuilding 부모는 Serializable 인터페이스를 구현 합니다.

코드의 일부 :

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
자신을 정의하는 대신 값을 생성해야합니까? 새 클래스를 만드는 경우 예 1L를 들어 ID로 정의 하고 직렬화 된 양식이 변경 될 때 증가 하는 것이 좋습니다 . ( stackoverflow.com/questions/888335/… 참조 ).
Duncan Jones

1
stackoverflow.com/questions/24573643/… 아주 좋은 해결책이 있습니다.
Pankaj Kumar

답변:


588

이전 버전의 IntelliJ IDEA가 있는지 확실하지 않지만 파일설정 ...검사직렬화 문제 → 'serialVersionUID'가없는 직렬화 가능 클래스로 이동하면 제공하는 클래스에서 경고를 표시합니다.

여기에 이미지 설명을 입력하십시오

첫 번째 수업을 시도하면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

BTW : { }컴파일 오류를 수정하기 위해 각 클래스의 끝에 추가 할 때까지 경고가 표시되지 않았습니다 .


2
시도 File| Invalidate Caches도움이되지 않으면 샘플 프로젝트로 support@jetbrains.com에 연락하여 재생산하십시오.
CrazyCoder

1
idea.log예외는 Linux의 암호화 된 홈 디렉토리가 커널 버그 로 인해 문제를 일으키는 것으로 알려져 있습니다 (도움말 | 로그인 표시 ...)를 확인하십시오 .
CrazyCoder

1
java.lang.NoClassDefFoundError와 같은 예외가 많이 있습니다. org / intellij / lang / annotations / MagicConstant;
Kirill Bazarov

2
IDEA를 다시 설치하고 플러그인을 제거했는데 도움이됩니다. 많은 Tnx.
Kirill Bazarov

5
v15에서 작동시키는 방법은 ClassName 위로 마우스를 가져 가면 경고가 표시되고 마우스가 거터쪽으로 천천히 움직입니다. 이때 "전구"가 화면에 나타납니다. (처음 의도 한대로 작동하지 않으면 몇 번 시도하십시오). 그런 다음 필드 작성 옵션을 클릭하여 uid를 작성할 수 있습니다. 이것이 붙어있는 사람들에게 도움이되기를 바랍니다.
Niyaz

173

Olivier Descout로 GenerateSerialVersionUID 플러그인을 설치하십시오 .

메뉴 파일설정플러그인리포지토리 찾아보기GenerateSerialVersionUID

플러그인을 설치하고 다시 시작하십시오.

이제 메뉴 코드생성 → serialVersionUID` 또는 바로 가기 에서 ID를 생성 할 수 있습니다 .


14
이 작업을 수행하려면 실제로 외부 플러그인이 필요합니까?
H.Rabiee

예, 이미 IntelliJ 플러그인 저장소의 일부인 플러그인이 필요합니다.
Sileria

Intellij IDEA 12.1에서 나를 위해 일했습니다
Sagar Hatekar

13.0.2에서 나를 위해 일합니다.
user1978019

Android Studio 0.8.9에서 작동
Itai Hanski

67

플러그인없이 : IntelliJ에서 하이라이트를 활성화하면됩니다.

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'-플래그를 설정하고 클릭하십시오 'OK'.

이제 클래스가 구현 Serializable하면 하이라이트가 표시 alt+Enter되고 클래스 이름에서 생성을 제안합니다 private static final long serialVersionUID.

추신 : 여기 에서 찍은


4
감사. 왜 전구가 보이지 않는지 모르겠지만 클래스 이름을 클릭하고 Alt-Enter를 입력하면 트릭이 발생합니다.
존 S


이것이 더 최신입니다
Christian Matthew

39

Serialization에 시간을 보낸 후, 우리는 serialVersionUID 임의의 값으로 의미있는 값을 제공해야합니다.

여기에 대한 자세한 설명이 있습니다. 나는 여기에 의견을 대처하고 있습니다.

실제로 직렬 버전 UID를 "생성"해서는 안됩니다. 이 ID가 Java에서 어떻게 사용되는지에 대한 일반적인 오해에서 비롯된 멍청한 "기능"입니다. 예를 들어 1L로 시작하여 클래스의 새 버전이 이전 버전 (이전에는 직렬화되었을 수도 있음)을 이전 버전으로 렌더링해야한다고 생각할 때마다이 ID에 의미 있고 읽기 쉬운 값을 제공해야합니다. 이러한 ID를 생성하는 모든 유틸리티는 기본적으로 ID가 정의되지 않은 경우 JVM이 수행하는 작업을 수행합니다. 클래스 파일의 내용을 기반으로 값을 생성하므로 읽을 수없는 의미없는 긴 정수가 나타납니다. JVM의 관점에서 클래스의 모든 버전을 구별하려면 serialVersionUID 값을 지정하지 않아야합니다 .JVM이 즉시 버전을 생성합니다. 각 수업 버전의 가치는 고유합니다. 이 값을 명시 적으로 정의하는 목적은 직렬화 메커니즘에 동일한 SVUID를 가진 클래스의 다른 버전을 동일한 것처럼 취급하도록 (예 : 이전 직렬화 된 버전을 거부하지 않도록)하는 것입니다. 따라서 ID를 정의하고 절대 변경하지 않는 경우 (그리고 자동 생성에 의존하고 ID를 다시 생성하지 않은 이후에 수행 한 작업이라고 가정) 모든 버전 (절대적으로 다른 버전)을 보장해야합니다. 클래스는 직렬화 메커니즘에 의해 동일하게 간주됩니다. 너가 원하는게 그거야? 그렇지 않은 경우 그리고 실제로 객체가 인식되는 방식을 제어하려면 클래스가 크게 변경되었다고 결정할 때 스스로 이해하고 쉽게 업데이트 할 수있는 간단한 값을 사용해야합니다.

도움이 되었기를 바랍니다. 행운을 빕니다.


2
고마워, 나는이 간단한 사실을 오랫동안 건너 뛰고있었습니다!
dedek

1
serialVersionUID역 직렬화에서 이전 버전을 지원하지 않으려는 경우 실제로 새로운 난수를 사용하여 를 다시 생성합니다 . 어쩌면 난수를 사용할 필요는 없지만 1로 시작하여 증가시킬 수 있습니다. 그러나 3L나에게는 더 의미가 없습니다 -3518231192373568183L. 따라서 두 솔루션이 비슷하게 작동한다고 생각합니다. 난수는 포크와 브랜치가있는 비선형 히스토리에서 작동한다는 이점이 있습니다.
JojOatXGME

16

가치 사용을 생성하기 위해

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

randomLong 템플릿 변수에 다음 값을 제공하십시오. groovyScript ( "new Random (). nextLong (). abs ()")

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


1
라이브 주석을 사용 하여이 의견을 좋아합니다.이 솔루션은 가장 빠른 솔루션이며 가장 사용자 정의가 가능합니다 (예를 들어 줄 바꿈을 제거했습니다). 스크립트 입력 구성하려면 안드로이드 스튜디오> 환경 설정> 편집기> 라이브 템플릿으로 이동하여이 값을 사용 편집 변수 새가를 생성 (더하기 아이콘)
HCPL

13

또한 작업을 수행 할 라이브 템플릿을 추가 할 수 있습니다.

그렇게하려면 Ctrl+Alt+S-> "Live Templates"섹션->을 누르십시오.other (또는 원하는 w / e)을

그런 다음 다음과 같은 정의로 새 것을 작성하십시오.

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

그런 다음 definition범위를 선택 하고 다른 이름으로 저장하십시오.'serial'

이제 serialTAB수업 본문을 입력 할 수 있습니다 .


3

serialVersionUID를 생성하는 또 다른 방법 >Analyze >Run Inspection by Name은 상황에 맞는 메뉴 (또는 기본적으로 ctrl+ alt+ shift+ 인 키보드 단축키 i)에서 사용하고 "serialVersionUID"가없는 직렬화 가능 클래스를 입력하는 것입니다 (또는 "serialVersionUID"를 입력하고 앞의 유형을 입력하는 것). 기능은 당신을 위해 그것을 찾을 것입니다.

아이디어> 분석> 이름으로 검사 실행 그런 다음 검사를 실행할 위치를 선택할 수있는 상황에 맞는 메뉴가 표시됩니다 (예 : 특정 모듈, 전체 프로젝트, 하나의 파일 등).

이 방법을 사용하면 일반 검사 규칙을 설정할 필요조차 없습니다.


니스, 이것은 나를 위해 일을했다. 누락 된 변수를 찾아서 추가 옵션을 표시했습니다.
arenaq

@arenaq 다행, 이것은 다른 누군가를 도왔다 ;-)
Alexander

2

버전으로 v2018.2.1

이동

환경 설정> 편집기> 검사> Java> 직렬화 문제> " 'serialVersionUID가없는 직렬화 가능 클래스" "를 토글하십시오.

클래스 선언 옆에 경고가 나타납니다.


1

Android Studio 2.1을 사용하고 있으며 클래스 이름을 클릭하여 전구를 가져 오는 일관성이 더 뛰어납니다.


1

"ser"라는 라이브 템플릿을 다른 그룹에 추가하고 "Applicable in Java : declaration"으로 설정하고 "Shorten FQ names"를 선택 해제하십시오. 다음과 같은 템플릿 텍스트를 제공하십시오.

$serial$

이제 변수를 편집하고 serial을 다음과 같이 설정하십시오.

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())

표준 Gradle 프로젝트 레이아웃을 가정합니다. Maven의 경우 / build /를 / target /으로 변경하십시오.


1

가장 쉬운 최신 방법 : Alt+ Enter켜기

private static final long serialVersionUID = ;

IntelliJ는 다음의 공백에 밑줄을 긋습니다 =. 커서를 올려 놓고 alt+ Enter( Mac의 경우 Option+) Enter를 누르십시오 . "Randomly Change serialVersionUID Initializer"라는 팝업이 나타납니다. Enter 키를 누르면 해당 공간이 임의의 길이로 채워집니다.


0

많은 파일에 대해 serialVersionUID가없는 경우 IntelliJ IDEA가 제대로 작동하지 않을 수 있습니다. 이 목표를 쉽게 달성하기 위해 간단한 스크립트를 작성했습니다.

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

폴더 add_serialVersionUID.sh에서 와 같이이 스크립트를 저장 ~/bin합니다. 그런 다음 Maven 또는 Gradle 프로젝트의 루트 디렉토리에서 다음을 실행하십시오.

add_serialVersionUID.sh < myJavaToAmend.lst

이 .lst에는 serialVersionUID를 다음 형식으로 추가하기위한 Java 파일 목록이 포함되어 있습니다.

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

이 스크립트는 JDK serialVer 도구를 사용합니다. 이전 버전과의 호환성을 유지하면서 처음에 serialVersionUID가 설정되지 않은 수많은 클래스를 수정하려는 경우에 이상적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.