2010-01-28 5 views
1

(Joshua Bloch가 그의 책 Effective Java에서 설명한대로) ENUM 싱글 톤 인스턴스를 파일에 직렬화하려고합니다.ENUM 싱글턴 직렬화

public enum ElvisFan implements Serializable{ 
    INSTANCE; 
    private int totalSongsListened; 

private ElvisFan(){ 
    totalSongsListened=0; 
} 

public void set(int v){ 
    totalSongsListened=v; 
} 

public int get(){ 
    return totalSongsListened; 
} 

} 
} 

내가 성공적으로 내 모든 프로그램을 통해이 열거를 사용하고 있지만 내가 snakeyaml을 사용하여 파일이 열거를 쓸 때, 난 그냥 내 test.yaml 파일 !!com.chown.ElvisFan 'INSTANCE' 있습니다 열거 인스턴스는이 같은 간단한 자바 빈즈이다.

Yaml yaml = new Yaml(); 
yaml.dump(ElvisFan.INSTANCE, new FileWriter("test.yml"); 

가 나는 또한 운없이이 시도 :

JavaBeanDumper dumper = new JavaBeanDumper(); 
dumper.dump(ElvisFan.INSTANCE, new FileWriter("test.yml"); 

사람이 날 안내 주실 래요이 내가 뭘하는지입니다. 감사!

[편집]

정정 코드.

+1

enum은 상태를 갖지 않아야합니다. 그리고 열거 형에 하나의 가치 만 있습니다. 당신이 일하는 데 잘못된 도구를 사용하고있는 것처럼 보입니다. 당신은 정규 싱글 톤 (클래스)만을 원하지 않습니까? 싱글 톤을 전혀 사용할 수 없습니까? – abyx

+0

당신이 옳습니다. 나는 Enum이 무국적이어야한다는 것에 동의하지만, 나는이 종류의 열거 형을 우연히 발견했는지, 파일을 직렬화하는 방법이 될 수 있는지 알아보기 위해 노력하고있다. 나는 이것이 "좋은 디자인 관행"이라는 유행에서 이것을 묻지는 않는다는 점에 유의하십시오. 나는 "어떻게 이럴 수 있니?"라고 묻는 것뿐입니다. 이 클래스를 비 enum 싱글 톤 클래스로 변환하는 것은 그리 어렵지 않으므로 전체적으로 다음과 같이 요약 할 수 있습니다.이 클래스를 얻는다면 파일에 어떻게 쓰겠습니까? – ashokgelal

+0

SnakeYAML은 enum을 스칼라로 취급합니다. (JavaBeanDumper에서 매핑 노드를 사용하지 않는 한) JavaBean과 같은 비정상적인 열거 형을 덤프 할 사용자 지정 표현자를 제공해야합니다. – Andrey

답변

4

싱글 톤은 의미가 없습니다. 직렬화 가능 싱글 톤은 훨씬 덜 합리적입니다. 정의상 단 하나의 싱글 톤이 존재합니다. 그래서 당신이 싱글 톤을 deserialise 할 때 당신은 새로운 객체를 얻지 않을 것입니다. 동일한 이전 데이터를 사용하여 동일한 이전 인스턴스를 가져옵니다.

열거 형 직렬화는 특별히 처리됩니다. 이름과 유형으로 표현됩니다. 이전에 언급 한 것처럼 아무 의미가 없기 때문에 다른 어떤 상태도 저장되지 않습니다.

가변적 인 통계를 피하려면 코드를 수정하는 것이 좋습니다.

열거 형은 변경할 수있는 상태 여야합니다. 단일 인스턴스를 사용하여 열거 형을 직렬화하면 Comparator과 같은 다른 클래스를 구현하거나 키 또는 기타 용도로 사용할 수 있습니다.

+0

그게 내가 뭘 얻을 필요가있어 - 같은 오래된 데이터와 동일한 오래된 인스턴스. snakeyaml 문서가 덤프/열거 형 데이터에 대한 유사한 예제를 제공하기 때문에 데이터를 저장할 수 있다고 확신합니다. http://code.google.com/p/snakeyaml/wiki/Documentation#Enum – ashokgelal

+0

오래된 인스턴스는 무엇입니까? 존재하는 오래된 인스턴스 또는 실제로 직렬화 된 형식으로 존재하지 않는 오래된 "인스턴스". –

0

SnakeYAML은 List에 getter (getFirst())가 있어도 List를 매핑으로 사용하지 않는 시퀀스로 처리합니다. 열거 형을지도로 직렬화하는 이유는 무엇입니까?

비정상적인 열거 형을 JavaBean으로 덤프하려면 사용자 지정 대리인을 제공해야합니다. 테스트에는 사용자 지정 Representer/Constructor를 작성하는 방법에 대한 예제가 많이 포함되어 있습니다.