1

ENUM シングルトン インスタンス (Joshua Bloch の著書「Effective Java」で説明) をファイルにシリアル化しようとしています。ENUM インスタンスは、次のような単純な JavaBean です。

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 を使用してこの列挙型をファイルに書き込むと、ファイルに含ま!!com.chown.ElvisFan 'INSTANCE'test.yamlます。これは私がやっていることです:

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

私も運なしでこれを試しました:

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

誰かがこれについて私を案内してもらえますか。ありがとう!

【編集済】

コード修正。

4

2 に答える 2

4

シングルトンはまったく意味がありません。シリアライズ可能なシングルトンは、さらに意味がありません。定義上、シングルトンは 1 つだけです。したがって、シングルトンをデシリアライズしても、新しいオブジェクトを取得することはできません。同じ古いデータを持つ同じ古いインスタンスを取得します。

列挙型のシリアル化は特別に処理されます。それらは名前とタイプで表されます。前述のように意味がないため、他の状態は保存されません。

変更可能な静的を避けるために、コードを変更することをお勧めします。

列挙型は可変状態であってはなりません。単一のインスタンスで列挙型をシリアル化することは、 などの他のクラスを実装する場合Comparator、またはキーなどとして使用される場合に意味があります。

于 2010-01-28T07:51:23.120 に答える
0

リストにはゲッター (getFirst()) もありますが、SnakeYAML はリストをマッピングではなくシーケンスとして扱います。enum が map としてシリアル化されると予想するのはなぜですか?

このような異常な列挙型を JavaBean としてダンプするには、カスタムの Representer を提供する必要があります。テストには、カスタムの Representer/Constructor を作成する方法の例が多数含まれています。

于 2010-01-28T21:09:51.707 に答える