JavaRush /Java Blog /Random-KO /Java의 직렬화 가능 클래스 내에서 SerialVersionUID를 사용하는 이유
0xFF
레벨 9
Донецк

Java의 직렬화 가능 클래스 내에서 SerialVersionUID를 사용하는 이유

Random-KO 그룹에 게시되었습니다
Serialization많은 Java 개발자들에게는 항상 SerialVersionUID미스터리로 남아 있습니다. 가 무엇인지, 또는 -class 에서 SerialVersionUID선언하지 않으면 어떻게 되는지 에 대한 질문을 자주 봅니다 . 혼란스럽고 자주 사용되지 않는 것 외에도 이 질문의 또 다른 이유는 Eclipse IDE에 경고가 없기 때문입니다 . 예를 들어 " 직렬화 가능 클래스 Customer는 long 유형 의 정적 최종 SerialVersionUID 필드를 선언하지 않습니다. " long"). 이 기사에서는 Java의 기본 사항 뿐만 아니라 Java가 직렬화 및 역직렬화 프로세스에 미치는 영향도 배웁니다 . 토큰 인터페이스를 구현하여 클래스를 선언하면 외부화 가능 인터페이스를 사용하도록 프로세스를 구성하지 않는 한 Java 런타임은 기본 직렬화 메커니즘을 사용하여 해당 클래스의 인스턴스를 디스크에 저장합니다 . 직렬화 중에 Java 런타임은 나중에 클래스를 역직렬화할 수 있도록 클래스의 버전 번호를 생성합니다. Java에서는 이 버전 번호를 . 역직렬화 중에 일치하는 항목이 없으면 " " 스트림에서 예외가 발생하면서 프로세스가 종료되고 클래스 이름과 해당 . 이 문제를 해결하는 빠른 해결책은 이를 클래스의 유형 상수로 복사하고 정의하는 것입니다. 이 기사에서는 Java에서 사용해야 하는 이유와 직렬 서버 JDK 도구를 사용하여 이 ID를 생성하는 방법에 대해 알아봅니다 . 직렬화를 처음 접하는 경우 상위 10개 Java 직렬화 인터뷰 질문을 시청하여 지식을 평가하고 추가 읽기를 위한 이해의 격차를 찾을 수도 있습니다. (동시성) 및 (멀티스레딩) 과 마찬가지로 (직렬화)도 여러 번 읽을 가치가 있는 또 다른 주제입니다. SerialVersionUIDSerializableJava의 직렬화 가능 클래스 내에서 SerialVersionUID를 사용하는 이유 - 1SerialVersionUIDSerializableCustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.SerializableSerialVersionUIDSerialVersionUIDInvalidClassExceptionmainjava.io.InvalidClassExceptionSerialVersionUIDSerialVersionUIDprivate static final longSerialVersionUIDConcurrencyMulti-threadingSerialization

Java에서 SerialVersionUID를 사용하는 이유

SerialVersionUID내가 말했듯이, 클래스에서 와 같이 값을 정의하지 않은 경우 static final long직렬화 메커니즘이 이를 대신 수행합니다. 이 메커니즘은 클래스의 필드, 해당 액세스 한정자, 구현하는 인터페이스, 심지어 다른 컴파일러 구현을 포함한 많은 세부 사항에 민감합니다. 클래스를 변경하거나 다른 컴파일러를 사용하면 다른 결과가 생성될 수 있습니다 SerialVersionUID. 직렬화된 데이터가 다시 로드되는 것을 중지합니다. 이 ID를 생성하기 위해 Java의 직렬화 메커니즘에 의존하는 것은 위험하므로 Serialized 클래스SerialVersionUID 에서 이를 명시적으로 정의하는 것이 좋습니다 . Java 직렬화와 이를 잘못 처리할 때 발생하는 문제를 이해하려면 Java 고전인 Joshua Bloch "Effective Java"를 읽어볼 것을 적극 권장합니다. 그런데 JDK는 내 컴퓨터 C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe 의 JAVA_HOME 디렉토리 의 bin 디렉토리 에 있는 도구도 제공합니다 . 오래된 수업을 위해. 이는 클래스를 변경하여 직렬화를 중단하고 애플리케이션이 직렬화된 인스턴스를 다시 로드할 수 없는 경우에 매우 유용합니다. 이 유틸리티를 사용하여 쉽게 이전 인스턴스를 만든 다음 필드를 private static final long 으로 선언하여 명시적으로 사용할 수 있습니다 . 그런데 성능 및 보안상의 이유로 직렬화에 일반 바이너리 형식을 사용하는 것이 좋습니다. "Effective Java"에는 일반 형식의 장점을 매우 자세히 보여주는 여러 단락이 있습니다. serialverSerialVersionUIDSerialVersionUID SerialVersionUID

Serialver JDK 유틸리티를 사용하여 SerialVersionUID를 생성하는 방법

serialver수업을 생성하는 데 사용할 수 있습니다 SerialVersionUID. 이는 클래스 개발에 특히 유용하며 유틸리티는 SerialVersionUID복사하기 쉬운 형식으로 반환됩니다. serialver예제에 표시된 대로 JDK 유틸리티를 사용할 수 있습니다 .
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
유틸리티를 명령 serialver으로 사용할 수도 있습니다. 이렇게 하면 전체 클래스 이름을 가져와 표시하는 검사기가 열립니다 . GUI$ serialver –showserial versionSerial version

요약

이제 우리는 이것이 무엇인지 SerialVersionUID, 클래스에서 선언하는 것이 왜 중요한지 알았 Serializable습니다. 이제 Java SerialVersionUID와 관련된 몇 가지 중요한 사실을 검토할 차례입니다.
  1. SerialVersionUID직렬화된 데이터의 버전을 나타내는 데 사용됩니다.

  2. SerialVersionUID클래스에서 선언하지 않으면 Java 런타임이 이를 수행하지만 이 프로세스는 필드 수, 필드 유형, 필드 액세스 수정자, 클래스에서 구현되는 인터페이스를 포함하여 클래스의 많은 메타데이터에 민감합니다. 등. Oracle의 직렬화 문서에서 정확한 정보를 찾을 수 있습니다.

  3. 기본 메커니즘을 방지하려면 SerialVersionUID를 전용 정적 최종 긴 변수로 선언하는 것이 좋습니다. Eclipse 와 같은 일부 IDE에서는 이를 잊어버린 경우 경고를 표시합니다(예: "직렬화 가능 클래스 고객은 long 유형의 정적 최종 SerialVersionUID 필드를 선언하지 않습니다."). Window > Preferences > Java > Compiler > Errors/Warnings > 잠재적인 프로그래밍 문제로 이동하여 이 경고를 비활성화할 수 있지만 그렇게 하지 않는 것이 좋습니다. 데이터 복구가 필요하지 않은 경우에만 부주의할 수 있습니다. Eclipse IDE에서 이 오류가 나타나는 모습은 다음과 같습니다. 먼저 빠른 결정을 내리기만 하면 됩니다. Java의 직렬화 가능 클래스 내에서 SerialVersionUID를 사용하는 이유 - 2

  4. JDK의 serialver 유틸리티를 사용하여 Java 클래스의 직렬 버전을 생성할 수도 있습니다. 이 유틸리티에는 - 매개변수를 전달하면 활성화되는 GUI도 있습니다 show.

  5. 직렬화의 가장 좋은 방법은 SerialVersionUID특히 RMI와 같이 직렬화된 데이터에 의존하는 클라이언트-서버 애플리케이션으로 작업하는 경우 역직렬화 관련 문제를 방지하기 위해 를 명시적으로 선언하는 것입니다.
SerialVersionUID모든 것이 Java에 관한 것입니다 . 이제 우리는 클래스에서 올바르게 선언하는 것이 왜 중요한지 알았습니다 SerialVersionUID. 잠재적으로 클래스의 역직렬화가 중단될 수 있는 이 알림에 대해 IDE에 감사드립니다. 직렬화 및 관련 개념에 대해 더 자세히 알고 싶다면 다음 멋진 기사를 확인해 보세요. 원본은 여기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION