Serialization(직렬화) 조건 - Serialization 시 경고 메시지, serialVersionUID, serialVersionUID 명시적 지정, serialVersionUID 생성

CODEDRAGON Development/Java

반응형

 

 

Serialization(직렬화) 조건

serialVersionUID

·       Serialization 시 경고 메시지

·       serialVersionUID

·       serialVersionUID 명시적 지정

·       serialVersionUID 생성

 

 

 

Serialization(직렬화) 조건

·       객체의 멤버들 중에 Serializable 인터페이스가 구현되지 않은 객체가 있으면, 직렬화 할 수 없습니다.(NonSerializableException)

·       직렬화 해야 되는 객체 안의 객체 중 Serializable 인터페이스가 구현되지 않으면서 전송하지 않아도 되는 객체 앞에는 transient 를 선언해줍니다. 그러면 직렬화 대상에서 제외되므로 해당 객체는 직렬화가 가능합니다.

·       객체를 직렬화는 Serializable인터페이스를 이용하면 간단하게 구현할 수 있지만 실제로는 객체에 정의된 모든 인스턴스변수에 대한 참조를 확인하기 때문에 매우 복잡하고 시간이 오래 걸리는 작업입니다.

·       만약 ArrayList와 같은 객체를 직렬화하면 ArrayList에 저장된 모든 객체들과 각 객체의 인스턴스변수가 참조하고 있는 객체들까지 모두 직렬화됩니다.

 

 

 

Serialization 경고 메시지

직렬화를 위해 자바에서는 java.io.Serializable 이라는 interface를 제공하고 있습니다.

직렬화하기 위해서는 implements Serializable 이라고 class명 옆에다 추가해서 인터페이스를 구현해주면 됩니다.

이클립스에서 클래스에 인터페이스를 구현하면 static final long 타입의 serialVersionUID 상수를 선언하라는 경고문구를 노란색 warning 아이콘과 함께 확인 할 수 있습니다.

The serializable class PersonInfo does not declare a static final serialVersionUID field of type long


 

 

Warning-The serializable class Object does not declare a static final serialVersionUID field of type long 해결방법

이클립스내에서 이 경고메시지을 제외하도록 설정할 수 있습니다.

http://codedragon.tistory.com/2663

 

 

 

serialVersionUID

serialVersionUID같은 클래스임을 알려주는 식별자 역할을 합니다.

serialVersionUID를 지정하지 않으면 실행시점에서 JVM이 디폴트 값을 적용하게 되며, 디폴트값으로 생성되는 serialVersionUID의 알고리즘은 Java(TM) Object Serialization Specification에 정의된 것을 따르게 됩니다.

즉 객체가 직렬화될 때 클래스에 정의된 멤버들의 정보를 이용해서 자동으로 식별자가 생성되게 됩니다. 그래서 역직렬화할 때 serialVersionUID를 비교함으로써 직렬화할 때의 serialVersionUID와 일치하는지 확인할 수 있습니다.

 

 

 

serialVersionUID 명시적 지정

모든 serialization이 필요한 클래스에는 명시적으로 serialVersionUID를 선언해줄것을 강력하게 권유하고 있는데 그 이유는 디폴트 serialVersionUID 계산은 클래스의 세부 사항을 매우 민감하게 반영하기 때문에 컴파일러 구현체에 따라서 달라질 수 있어 deserialization(serialization 했던 객체를 복구하는 과정)과정에서 예상하지 못한 InvalidClassExceptions을 유발할 수 있기 때문입니다.

즉 서로 다른 자바 컴파일러 구현체 사이에서 동일한 serialVersionUID값을 얻기 위해서는 명시적으로 serialVersionUID값을 선언해야 하며 serialVersionUID는 가능하면 private으로 선언하라는 것이 권유사항입니다.

 

네트워크를 통해 객체를 직렬화하여 전송하는 경우 보내는 쪽과 받는 쪽 모두 같은 버전의 클래스를 가지고 있어야 합니다. 그런데 클래스가 조금이라도 변경이 되어 있다면 해당 클래스의 serialVersionUID가 변경되므로 클래스가 다시 배포하는 것이 되어서 프로그램의 관리가 어렵게 됩니다.(클래스명이 같더라도 클래스의 내용이 변경되면 역직렬화가 실패하여 예외가 발생합니다.)

이럴 경우 클래스 내에 명시적으로 serialVersionUID 부여하여 수동으로 관리해 주면 됩니다. 그러면 클래스의 내용이 변경되어도 serialVersionUID 클래스의 버전이 자동생성된 값으로 변경되지 않습니다.

class MySerial implements Serializable{

private static final long serialVersionUID = -8560314662460626171L;

}

 

 

serialVersionUID 생성

serialVersionUID의 값은 정수값이면 어떤 값도 지정할 수 있습니다.

serialVersionUID의 값은 클래스들 간에 같은 값이 존재하지 않도록 유일한 값을 지정해야 합니다.

serialVersionUID에 유일한 값을 생성하기 위해 serialver.exe 도구를 이용하여 생성된 값을 일반적으로 사용합니다.

 

serialVersionUID=1;

serialVersionUID=123456789;

 

 

 

반응형