2016-12-07 4 views
1

자바 사양은 말한다 :ObjectStreamClass.getSerialVersionUID에 의존하는 것이 안전하지 않은 이유는 무엇입니까?

사람이 파고 있었다하세요 "강하게 기본이 계산이 컴파일러 구현에 따라 달라질 수 있습니다 수준의 세부 사항에 매우 민감 serialVersionUID의 이후의 모든 직렬화 가능 클래스가 명시 적으로 serialVersionUID의 값을 선언하는 것이 좋습니다" ? getSerialVersionUID() 메서드는 리플렉션을 수행하며 리플렉션은 일반적으로 모든 곳에서 사용되므로 컴파일러에 따라 무엇이 다른가요?

이 질문의

답변

1

브릴리언트 설명은 J. 블로흐의 책 "효과적인 자바"에 나와있다 :

"항목 74 : 신중하게 직렬화 구현"

하는 것은 명시 적으로이 번호를 지정하지 않은 경우 serialVersionUID라는 이름의 고정 길이 필드 을 선언함으로써 시스템은 자동으로 클래스에 복잡한 프로 시저를 적용하여 런타임에 을 생성합니다. 자동으로 생성 된 값은 클래스 이름, 구현하는 인터페이스의 이름 인 및 해당 공용 및 보호 된 구성원의 영향을받습니다. 당신이 사소한 편리한 메소드를 추가하여, 예를 들어, 어떤 방법으로 이런 일을 변경하면 자동으로 생성 된 직렬 버전 UID는 변경

UPD : 그것은 왜 나는 또한, 해설 요청했다 컴파일러 종속. 실제로 여기에 컴파일러 의존성은 getSerialVersionUID() 알고리즘 자체가 아닙니다 (메소드는 런타임에 호출됩니다). 그러나 클래스 자체가 어떻게 기술되어 있는지에 있습니다. 예를 들어 컴파일 타임에 클래스에 몇 가지 합성 메서드를 추가 할 수 있습니다.이 메서드는 SUID에서도 계산됩니다. 자세한 내용은 방법 ObjectStreamClass.computeDefaultSUID()을 살펴보고 그 방법과 기본 SUID 계산 방법을 확인하십시오.

+0

그러나이 설명은 컴파일러에 종속 된 이유를 설명하지 않습니다. getSerialVersionUID()는 실시간으로 값을 계산하는 데 사용됩니까? – ejaenv

+0

@ejaenv, 내 upd을 봐라. – Andremoniy

+1

컴파일러의 의존성이 없어도,'static' 필드 나 * methods *를 변경할 때, 영속성 폼을 호환되지 않는 것으로 간주하는 알고리즘을 사용하고 싶지는 않을 것이다. 클래스에 이니셜 라이저가 있는지 여부에도 영향을 미칩니다. 인용문 텍스트에서 언급하지 못한 것은 "모든 공개 및 보호 된 회원 *"뿐만 아니라 모든 패키지 전용 멤버도 설명되므로 내부 클래스 접근 자와 같은 합성 메소드가 중요한 이유입니다. – Holger