2012-12-19 3 views
0

제목에서 이전과 동일한 질문이 올 것으로 예상되지만이 점이 다릅니다.Java 용 SerialVersionUID 생성 클래스

원격으로 호출해야하는 경우 EJB3 및 오프 코스로 작업하고 있는데 모든 데이터 객체가 Serializable 인터페이스를 구현해야합니다.

문제는 대부분의 데이터 객체가 (Velocity Templates를 사용하여) 생성되고 한 번에 컴파일되고 패키지된다는 것입니다. 지금은 다음과 같이 모든 클래스에서 기본 serialVersionUID를 하드 코딩했습니다.

private static final long serialVersionUID = 1L; 

하지만 다음과 같은 방법이 있는지 궁금합니다.

private static final long serialVersionUID = getSerialUID(); 
private static long getSerialUID() { 
    // Serial Version Algo code here 
} 

또한 Default serialVersionUID를 사용하는 데 문제가 있습니까? Algo를 사용하여 고유 한 ID를 생성해야합니까?

답변

1
  1. 기본 serialVersionUID를 사용하는 데 문제가 있습니까?

    동일한 클래스의 버전이 이상인 경우를 제외하고는 기본값 serialVersionUID을 사용하는 데 문제가 없습니다.

    읽기 : What is a serialVersionUID and why should I use it?

  2. 정말 너 한테을 사용하여 고유 ID를 생성해야합니까?

    답변은 다시 아니요. Algo를 사용하여 고유 한 ID를 생성하지 않아도됩니다. 당신은 동일한 클래스의 다른 버전이있는 경우 다음의 serialVersionUID와 같은 고유 번호를 제공 할 수있다 (예를 들면의 serialVersionUID = 123과의 serialVersionUID는 = 456) 난 강력하게 당신이 자바 독을 통해 이동하는 것이 좋습니다

java.io.Serializable

+0

정보를 제공해 주셔서 감사 드리며 문서를 살펴 보니 의미가 있습니다. 그러나 확실히 한 가지는 ... serialVersionUID가 필요하며 기본값이 1L이 아니어야합니다. 이제는 표준 UUID를 사용하여 클래스 구조가 같아도 새 클래스가 생성 될 때마다 새로운 UUID를 사용해야합니까? 아니면 HashCode 메서드를 사용하여 클래스를 검색해야합니까? HashCode 사용법에 대한 예가 있습니까? – SJunejo

1

첫 번째 대답은 도움이 되겠지만 serialVersionUID 클래스를 생성하는 방법을 알려주지는 않습니다. 나는 모든 클래스가 Velocity Template에 의해 생성되므로 코드 생성시에 그것을 얻어야한다. 그래서 모든 속성에 대해 hashcode()를 얻고 끝에 serialVersionUID를 추가하는 메소드를 만들었습니다. 예를 들어;

public int getSerialVerionUID() { 
    return getName().hashCode() + 
     getTypeName().hashCode() + 
     getCardinality().hashCode() + 
     getComplexity().hashCode(); 
} 

속성이 변경되는 즉시 우리는 다른 UID를 갖게되고 그게 우리가 찾고있는 전부입니다.

희망 사항이 도움이 되었기를 바랍니다.

+4

일련 번호는 해시가 아니므로 일련 번호는 하나처럼 계산해서는 안됩니다. 객체가 가지고있는 _values_에 의존해서는 안되지만 _members_입니다. –

관련 문제