2010-06-16 4 views
16

개체를 serialize 할 때 클래스 버전에서 serialVersionUID 메커니즘을 사용하여 두 형식의 호환성을 보장 할 수 있습니다.자바 직렬화에서 enums의 일관성을 유지하는 방법은 무엇입니까?

그러나 열거 형 값 필드를 직렬화하면 어떻게됩니까? 직렬화와 비 직렬화간에 enum 유형이 조작되지 않았는지 확인하는 방법이 있습니까?

OperationResult {SUCCESS, FAIL}와 같은 열거 형과 직렬화되는 개체에서 "result"라는 필드가 있다고 가정합니다. 객체를 직렬화 해제 할 때 다른 사람이이 두 객체를 역으로 변경하더라도 결과가 여전히 올바른지 어떻게 확인할 수 있습니까? (열거 형이 정적 열거 형으로 다른 곳에서 선언되었다고 가정하십시오.)

호기심이 궁금합니다. 조작을 방지하기 위해 jar 수준 인증을 사용합니다.

+0

모두에게 감사드립니다. – Uri

답변

22

: 열거 기능의 http://www.theserverside.com/news/thread.tss?thread_id=50190#265205

디자이너는 런타임에 새로운 열거 객체를 생성 할 유스 케이스가없는 을 결정했다. 그들은 그것을 허락하지 않기 위해서 에 큰 신경을 썼다. 열거 객체 직렬화와 전체가 직렬화 복원 할 수없는 것처럼

따라서 보인다. 또한, http://java.sun.com/javase/6/docs/platform/serialization/spec/serial-arch.html#6469에서 :

열거 상수가 직렬화 다른 보통의 직렬화 또는 외부화 객체보다. 열거 형 상수 의 직렬화 된 형식은 이름만으로 구성됩니다. 필드 상수의 값은 양식에 이 없습니다. 열거 형 을 직렬화하려면 ObjectOutputStream이 상수 이름 메서드에 의해 반환 된 값인 을 씁니다. 열거 형 상수를 비 직렬화하려면 ObjectInputStream 은 스트림에서 상수 이름을 읽습니다. 비 직렬화 정수는 이며, java.lang.Enum.valueOf 메서드를 호출하고 상수의 열거 형을 인수로받은 상수 이름과 함께 전달하여 얻습니다.다른 직렬화 가능 또는 외부화 가능 객체와 마찬가지로 열거 형 상수 은 순차 화 스트림 에 후반에 나타나는 참조의 대상으로 작동 할 수 있습니다.

정의 할 수 없습니다 직렬화 enum 정수하는 과정 : 모든 클래스 고유의 writeObject, 의 readObject, readObjectNoData의, 에 writeReplace 및 readResolve에 방법 열거 유형에 의해 정의 직렬화 및 직렬화 복원시 를 무시됩니다. 마찬가지로 serialPersistentFields 또는 serialVersionUID 필드 선언 도 모두 무시됩니다. 모든 enum 유형은 이며 고정 serialVersionUID는 0L입니다. 형식의 데이터에 serializable 필드를 문서화하고 데이터를 보낼 필요가 없습니다. 보낸 데이터 형식에 변형이 없으므로 입니다.

5

열거 형은 deserialization 중에 읽혀집니다.

열거 인스턴스를 직렬화하는 규칙은 "보통"직렬화 객체 직렬화 에 대한 다를 : 버전 1.5의 serialization release notes 인용 열거 인스턴스의 직렬화 된 양식은 자사의 열거 일정 구성 이름과 해당 기본 열거 형을 식별하는 정보 이 포함됩니다. 클래스 정보가 적절한 ENUM 클래스를 찾아 하는 데 사용되며, Enum.valueOf 방법은 으로 행 상수 열거를 얻기 위해 클래스 및 상기 수신 상수 이름이라고 - 직렬화 동작은 잘 으로 다르다 반환. 에서

관련 문제