SerialVersionUID는 무엇이며 왜 그것을 사용해야합니까?
질문
Eclipse는 SerialVersionUID가 누락되었을 때 경고를 실행합니다.
Serializable 클래스 Foo는 정적 최종을 선언하지 않습니다. SerialVersionUID 유형의 필드입니다
SerialVersionUID 란 무엇이며 왜 중요합니까?누락 된 SerialVersionUID가 문제를 일으킬 예제를 보여주십시오.
답변
java.io.Serializable의 문서는 아마도 얻을 수있는 것처럼 설명합니다.
직렬화 런타임 동료는 직렬화 오브젝트의 보낸 사람과 수신자가 직렬화와 관련하여 호환되는 해당 객체에 대한 클래스가로드 된 인스턴스 및 수신자가 해당 객체에 대한 클래스가로드되었는지 확인하기 위해 Deserialization에서 사용되는 SerialVersionUID라는 버전 번호와 함께 사용되는 버전 번호와 관련됩니다.수신자가 해당 송신자의 클래스보다 다른 SerialVersionUID가있는 객체에 대한 클래스를로드 한 경우, deserialization은 InvalidClassexception.직렬화 가능 클래스는 정적, 최종 및 유형 길이가되어야하는 SerialVersionUID 필드를 선언하여 자체 SerialVersionUID를 명시 적으로 선언 할 수 있습니다.
임의의 액세스 - 수정 자 정적 최종 길이가 긴 SerialVersionUID = 42L;
직렬화 가능 클래스가 SerialVersionUID를 명시 적으로 선언하지 않으면, Serialization 런타임은 Java (TM) 객체 직렬화 사양에 설명 된대로 클래스의 다양한 측면을 기반으로 해당 클래스의 기본 SerialVersionUID 값을 계산합니다. 그러나 기본 SerializionUID 계산이 컴파일러 구현에 따라 다를 수있는 클래스 세부 정보에 매우 민감한 SerializableUsionUID 계산이 SerializableUsionUID 계산을 명시 적으로 선언하는 것이 좋습니다. 따라서 Deserialization 동안 예기치 않은 InvalidClasSexceptions가 발생할 수 있습니다. 따라서 다른 Java 컴파일러 구현에서 일관된 SerialVersionUID 값을 보장하기 위해 Serializable 클래스는 명시 적 SerialVersionUID 값을 선언해야합니다. 또한 SerialVersionUID 선언은 가능한 경우 사설 수정자를 사용하는 것이 강력히 권장되므로 SerialVersionUID 필드는 즉시 선언하는 클래스에만 적용되므로 상속 된 구성원으로 유용하지 않습니다.
답변
구현을 위해 Serialize를 시행 해야하는 경우 (예를 들어, HttpSession을 위해 직렬화하는 경우 누가 걱정하는지, 예를 들어 저장되어 있거나 아닙니다.그런 다음이를 무시할 수 있습니다.
실제로 직렬화를 사용하는 경우 직렬화를 직접 사용하여 오브젝트를 저장하고 검색 할 계획이라면 문제가됩니다.SerialVersionUID는 클래스 버전을 나타내며 현재 버전의 클래스 버전이 이전 버전과 역 호환되지 않는 경우 증가시켜야합니다.
대부분의 시간은 직렬화를 직접 사용하지 않을 것입니다.이 경우 빠른 수정 옵션을 클릭하여 기본 SerialVersionUID를 생성하고 걱정하지 마십시오.
답변
Josh Bloch 's Book 효과적인 Java (2 번째 판)를 연결할 수있는이 기회를 올릴 수 없습니다.10 장은 Java 직렬화에서 필수 자원입니다.
조쉬 당 자동 생성 된 UID는 클래스 이름, 구현 인터페이스 및 모든 공개 및 보호 된 구성원을 기반으로 생성됩니다.어떤 식 으로든 이들 중 하나를 변경하면 SerialVersionUID가 변경됩니다.그래서 여러 번 이상의 버전이 직렬화되거나 나중에 저장소에서 검색되거나 나중에 저장된 것 중 하나를 검색 할 수없는 경우에만 엉망이 필요하지 않습니다.
지금은 무시하고 일부 방식으로 클래스를 변경해야하지만 호환성을 유지해야합니다. 클래스의 호환성을 유지하려면 JDK Tool Serialver를 사용하여 이전 클래스의 SerialVersionUID를 생성하고 명시 적으로 설정할 수 있습니다.새로운 수업에서.(변경 사항에 따라 WriteObject 및 ReadObject 메서드를 추가하여 사용자 정의 직렬화를 구현해야 할 수도 있습니다. Serializable Javadoc 또는 전술 한 제 10 장 참조)
답변
Eclipse에게 이러한 serialversionUID 경고를 무시하도록 알 수 있습니다.
창> 환경 설정> Java> 컴파일러> 오류 / 경고> 잠재적 인 프로그래밍 문제
알지 못했을 경우에 대비 하여이 섹션에서 사용할 수있는 많은 경고가 많이 있습니다 (또는 심지어 오류로보고 된 것으로보고 있음). 많은 사람들이 매우 유용합니다.
잠재적 인 프로그래밍 문제 : 가능한 우발적 인 부울 과제 잠재적 인 프로그래밍 문제 : NULL 포인터 액세스 불필요한 코드 : 로컬 변수는 읽지 않습니다 불필요한 코드 : 중복 NULL 수표 불필요한 코드 : 불필요한 캐스트 또는 'InstanceOf'
그리고 더 많은.
답변
SerialVersionUID는 직렬화 된 데이터의 버전 관리를 용이하게합니다.그 값은 직렬화 될 때 데이터와 함께 저장됩니다.직렬화 할 때 직렬화 된 데이터가 현재 코드와 일치하는 방식을 확인하려면 동일한 버전이 확인됩니다.
데이터를 버전 버전을 사용하려면 일반적으로 0의 직렬 버전으로 시작하여 직렬화 된 데이터를 변경하는 클래스에 대한 모든 구조적 변경으로 모든 구조적 변경으로 충돌합니다 (비 과도 필드 추가 또는 제거).
내장 된 De-serialization 메커니즘 (in.defaultReadObject ())은 이전 버전의 데이터에서 직렬화를 거부합니다.그러나 이전 데이터를 읽을 수있는 자신의 ReadObject () - 함수를 정의 할 수 있습니다.그런 다음이 사용자 지정 코드는 SerialVersionUID를 확인하여 데이터가 입력하고있는 버전을 확인하고이를 직렬화하는 방법을 결정할 수 있습니다.이 버전 관리 기술은 여러 버전의 코드를 생존하는 직렬화 된 데이터를 저장하는 경우에 유용합니다.
그러나 이러한 장시간 동안 직렬화 된 데이터를 저장하는 것은 매우 일반적이지 않습니다.직렬화 메커니즘을 사용하여 예를 들어 캐시에 데이터를 일시적으로 기록하거나 코드베이스의 동일한 버전의 동일한 버전의 다른 프로그램으로 네트워크를 통해 네트워크를 통해 데이터를 기록하는 것이 훨씬 흔합니다.
이 경우 직접 호환성을 유지하는 데 관심이 없습니다.실제로 통신하는 코드 기반이 동일한 버전의 관련 클래스를 갖는지 확인하는 것에 대해서만 염려합니다.그러한 수표를 용이하게하기 위해서는 이전처럼 SerialVersionUID를 유지해야하며 수업을 변경할 때 업데이트하는 것을 잊지 마십시오.
필드를 업데이트하는 것을 잊어 버리면 다른 구조가 있지만 동일한 SerialVersionUID를 사용하여 두 개의 다른 버전의 클래스로 끝날 수 있습니다.이 경우 기본 메커니즘 (in.defaultReadObject ())은 차이를 감지하지 못하고 호환되지 않는 데이터를 제거하려고 시도합니다.이제 Cryptic 런타임 오류 또는 자동 실패 (Null 필드)로 끝날 수 있습니다.이러한 유형의 오류는 찾기가 어렵습니다.
따라서이 USECASE를 돕기 위해 Java 플랫폼은 SerialVersionUID를 수동으로 설정하지 않는 선택을 제공합니다.대신 클래스 구조의 해시가 컴파일 타임에 생성되고 ID로 사용됩니다.이 메커니즘은 동일한 ID를 사용하여 다른 클래스 구조를 가지지 않고 위에서 언급 한 하드 트레이스 런타임 직렬화 실패를 얻지 못할 것입니다.
그러나 자동 생성 ID 전략에 뒷면이 있습니다.즉, 동일한 클래스에 대한 생성 된 ID는 컴파일러 (Jon skeet가 위에서 언급 한 바와 같이) 다를 수 있습니다.따라서 다른 컴파일러로 컴파일 된 코드간에 직렬화 된 데이터를 전달하면 IDS를 수동으로 유지 관리하는 것이 좋습니다.
언급 된 첫 번째 사용 사례와 같은 데이터와 거꾸로 호환되는 경우, 아마도 ID를 직접 유지하고 싶습니다.이것은 읽을 수있는 ID를 얻고 언제 변경하는 방법을보다 잘 제어 할 수 있습니다.
답변
SerialVersionUID는 무엇이며 왜 그것을 사용해야합니까?
SerialVersionUID는 각 클래스의 고유 한 식별자이며 JVM은 직렬화 중에 직렬화 중에 동일한 클래스가 사용되었는지 확인하도록 클래스 버전을 비교하여 Deserialization 동안로드됩니다.
JVM이 지정하지 않으면 JVM이 하나를 생성하지만 하나를 지정하는 것은 더 많은 제어를 제공합니다.생성 된 값은 서로 다른 컴파일러마다 다를 수 있습니다.또한, 때로는 오래된 직렬화 된 오브젝트 [역 비 호환성]의 deserialization을 금지하는 이유가 있기 때문에,이 경우 SerialVersionUID를 변경해야합니다.
Serializable 용 Javadocs는 다음과 같이 말합니다.
기본 SerialVersionUID 계산은 클래스에 매우 민감합니다 컴파일러 구현에 따라 다를 수있는 세부 사항은 따라서 예기치 않은 InvalidClassExceptions가 발생합니다 deserialization.
따라서 더 많은 제어를 제공하기 때문에 SerialVersionUID를 선언해야합니다.
이 기사에는 주제에 좋은 점이 있습니다.
출처:https://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it
최근댓글