ProgramingTip

serialVersionUID를 사용하거나 경고를 선언 하시겠습니까?

bestdevel 2020. 11. 15. 11:33
반응형

serialVersionUID를 사용하거나 경고를 선언 하시겠습니까?


예를 들어 HttpServlet을 확장하는 클래스를 만들고 싶습니다. 내 컴파일러는 내 클래스에 serialVersionUID가 있어야합니다. 이 선언하지 않을 것입니까?

당신은 무엇을하고 그 이유는 무엇입니까?


자바 모범 사례를 모르지만 화가 발생하지 않을 가능성이 있다고 주장하는 경우 그런 다음 경고가 적용되지 않을 것입니다.

기본적으로 생성 된 나중에 부모 클래스를 통해 생성을 생성하고 다음과 같은 기본 화 형식으로 끝날 수 있습니다.

  • 양식이 다른 버전의 코드간에 호환되지 않습니다.
  • 이것이 사실이라는 경고를 거부했습니다.

ID를 추가하는 것은 엉터리처럼 들립니다. 실제로 원하는 것은 생성 화가 아니기 때문입니다. HttpServlet이 클래스에 있다는 것을 "알고"라고하는 것을 의미합니다. 당신이 직렬화 할 수있는 것입니다.


인스턴스를 생성 할 계획이없는 경우 SuppressWarning을 추가합니다.

생성 된 구성 ID는 약간의 위험이 있습니다. 의도적으로 구성 번호를 부여하고 저장 제안합니다. 클래스가 변경된 최신 버전의 애플리케이션에서 업데이트 번호를 업데이트하는 것을 잊지 마세요. 클래스 필드가 변경된 경우 역화가 실패합니다. SuppressWarning이 있으면 최소한이 클래스를 선택할 수 있습니다.


나는 이클립스가 내 코드에 혼란을 더하는 것을 두려워하지 않는다!

누락 된 serialVersionUID에 대한 경고를 생성하지 않도록 Eclipse를 구성했습니다.


이것에 대한 대답에 대해 @ Steve Jessop에게 감사드립니다. 5 줄의 코드는 ... 거의 번거롭지 유효합니다.

@SuppressWarnings("serial")문제의 수업 바로 위에 추가했습니다 .

이 방법도 추가했습니다.

private void writeObject(ObjectOutputStream oos) throws IOException {
   throw new IOException("This class is NOT serializable.");
}

바라건대 그것이 Steve가 의미하는 바입니다. :)


이 생성이 자동으로 생성되고 자동으로 생성되는 자바가 자동으로 생성됩니다. 수행중인 작업 (역화, 수동 변경 추적 등)을 알고있는 경우에만 생성해야합니다.

대부분의 경우, 대부분의 경우 안전하다고 생각합니다.


생성 화 가능을 구현 하는 모든 클래스에 SVUID를 생성하는 것이 좋습니다. 그 이유는 간단합니다. 귀하는 귀하의 저장에 의해 언제 생성 될지 알

없습니다 . 서블릿을 구성 화하는 많은 서비스를 구성 할 수 있습니다. 모든 IDE에는 하나를 생성하거나 템플릿을 사용하고 svuid = 1L을 설정하는 옵션이 있습니다.


그 경고는 저를 미치게합니다. 클래스를 하위 클래스화할 때마다 스윙 직렬화하지 않을 것이라는 것을 알고 있지만 어리석은 경고가 있습니다. 하지만 예, Eclipse에서 생성했습니다.


Eclipse가 ID를 생성합니다. 신뢰할 수 있습니다. 경고는 무시할 수 없습니다. 또한 도착할 때 많은 문제를 해결해야합니다.


serialVersionUID는 자바를 생성하는 시간에 클래스를 생성합니다 (컴파일 할 때마다 변경됨).

객체를 deserialize 할 때 deserialized 객체의 serialVersionUID는 jvm의 클래스와 비교됩니다. 서로 다르면 호환되지 않는 제품이 발생합니다. 예를 들어 프로그램을 업그레이드하고 이전 클래스를 역화 한 후에 이런 일이 보관 수 있습니다.

나는 항상 serialversionUID에 1L을 사용합니다. (생성 된 꽃다발과 비교하여) 아프지 나중에 ID를 증가 시켜서 깨는 옵션을 뒤받습니다.


자세한 설명을 보려면 다음 링크를 살펴보십시오. http://technologiquepanorama.wordpress.com/2009/02/13/what-is-use-of-serialversiouid/


때에 따라 다르지.

다른 컴파일러를 사용하여 소스 코드를 여러 번 사용할 경우 여러 코드에 여러 번 사용할 수있는 경우 다른 직렬화 ID를 사용할 수 있습니다. 그런 다음 코드에서 명시 적으로 상수 serializationId를 고수해야합니다. 정 최종적이어야하며 클래스 당 (상속 불가능)이어야합니다.

항상 특정 컴파일러로 코드를 하나하고 항상 한 번에 모든 VM에 코드를 배포하는 경우 엄격한 버전 확인이 필요한 수 있고 실행해야하는 코드 버전이 있는지 확인해야합니다. 이 경우 경고를 금지해야합니다. VM이있는 경우에는 배포되지 않고 이전 버전의 코드를 실행하는 경우에도없는 경우에는 기발한 역화 된 개체가 아닌 옵션 화 예외가 보관 수 있습니다. 이것은 제 경우에 발생합니다. 우리는 매우 큰 클러스터를 가지고있는 배포 문제를 엄격한 버전 검사가 필요합니다.

어쨌든 기본 내장 화는 프로토콜 버퍼 나 절약형에 비해 매우 느리고 언어 간 상호 운용성을 지원하지 않기 때문에 가능하면 피해야합니다.


응용 프로그램이 항목을 합의 화하지 않는다는 것을 계획하고 응용 프로그램 전체에서 경고를 표시하지 않습니다. 이는 javac 명령 줄 인수를 사용하여 수행 할 수 있습니다.

javac -Xlint -Xlint:-serial *******

이렇게하면 "serial"을 모든 경고가 표시됩니다. Maven / SBT / Gradle과 같은 IDE 및 빌드 도구가 잘 작동합니다.

참고 URL : https://stackoverflow.com/questions/146715/use-the-serialversionuid-or-suppress-warnings

반응형