2016-08-29 6 views
1

비 직렬화 가능 필드에 불평하지. 나는 코드로 변경할 때FindBugs는 열거

:

class NonSerializable { 
} 

enum CanSerialize { 
    INSTANCE; 
    public NonSerializable nonSerializable; 
} 

FindBugs는 더 이상 불평하지 않습니다. FindBugs에서 버그가 있습니까? 아니면 열거 형에서 비 일시적이며 직렬화되지 않는 필드를 사용하는 것이 안전할까요?

+0

기록 용으로 만 사용하십시오. 왜 당신은'Serializable'이 필요합니까? – fge

+0

@fge 필자는 필요 없지만 Java의 모든 열거 형은 기본적으로'Serializable'입니다. –

+2

[사용자 정의 열거 형이 너무 있습니까?] (http://stackoverflow.com/questions/15521309/is -custom-enum-serializable-too), 열거 형 일 때 필드가 직렬화되지 않습니다. 올바르게 이해했다면 직렬화가 불가능한 직렬화가 필요 없습니다. –

답변

2

한편, 귀하의 질문에 대한 답변은 열거 형 내에 비 일시적인 비 직렬화 필드를 갖는 것이 안전하다는 것입니다. 다른 한편으로, enum이 할 때 직렬화되지 않습니다. 따라서 일시적으로 선언되지 않더라도 일시적인 필드처럼 작동합니다. 자바 객체 직렬화 스펙에서

: 열거 상수 열거 상수의

1.12 직렬화는 보통의 직렬화 또는 외부화 가능 객체와 다르게 직렬화합니다. 열거 형 상수의 직렬화 된 형식은 이름만으로 구성됩니다. field 상수 값이 양식에 없습니다. 열거 형 상수를 serialize하려면 ObjectOutputStream이 열거 형 상수의 이름 메서드에서 반환 한 값을 씁니다. 열거 형 상수를 비 직렬화하려면 ObjectInputStream은 스트림에서 상수 이름을 읽습니다. 역 직렬화 된 상수는 java.lang.Enum.valueOf 메소드를 호출하고 수신 된 상수 이름을 인수로 사용하여 을 따라 상수의 enum 유형을 전달하여 얻습니다. 다른 직렬화 가능 또는 외부화 가능 객체와 마찬가지로 열거 형 상수는 순차 나열 스트림에 후속 참조로 나타나는 대상으로 사용할 수 있습니다.

(http://docs.oracle.com/javase/1.5.0/docs/guide/serialization/spec/serial-arch.html#enum)

NonSerializable 그래서 여부 직렬화 않았거나 정말 변화를하지 않을 수 없습니다. 따라서 FindBugs는 열거 형에서 이것을 플래그하지 않는 것이 옳습니다.

내가 추측 할 수있는 한, enum이 클래스 로더에 의해로드 될 때 열거 형 필드가 매우 자주 최종적으로 초기화되고 초기화되므로 어쩌면 직렬화에 아무런 문제가 없다고 생각할 수 있습니다. 다시 초기화 할 수 있습니다. 다음에 enum이 클래스 로더에 의해로드됩니다. 내가 아는 어떤 것이 아닙니다.