1

透明なアクティベーション/永続性を備えたdb4o 8.0を使用しています... EnumSet(およびその他のもの)を含むクラスがあります。インスタンス化し、列挙値をセットに追加して保存します。DBで検索して取得し、オブジェクトをアクティブ化しようとすると、次の例外が発生します。

Exception in thread "main" java.lang.ClassCastException: class Resources.Enums$fooEnum_t != null
    at java.util.EnumSet.typeCheck(EnumSet.java:380)
    at java.util.RegularEnumSet.add(RegularEnumSet.java:160)
    at java.util.RegularEnumSet.add(RegularEnumSet.java:36)
    at com.db4o.typehandlers.CollectionTypeHandler.addToCollection(CollectionTypeHandler.java:120)
    at com.db4o.typehandlers.CollectionTypeHandler.activate(CollectionTypeHandler.java:45)
    at com.db4o.internal.Handlers4.activate(Handlers4.java:300)
...
...

enumSet を db4o に格納するには、次を使用します。

config.common().objectClass(EnumSet.class).translate(new com.db4o.config.TSerializable());

何が問題なのかわかりません。何か案は?

編集:
db4o について質問する場所がわかりません。SO コミュニティは db4o についてあまり活発ではないようです。これは、db4o があまり普及していないためか、それとも「サポート」のための別の場所があるためですか?

EDIT 2:
関連するかもしれないが役に立たない versant のフォーラムの投稿を見つけました: http://community.versant.com/Forums/tabid/98/aft/1046/Default.aspx#3370

もう一つ認識しました。java.util.EnumMap および java.util.EnumSet の組み込みサポートはありません。db4o は例外をスローします。これは、デフォルトのコンストラクターがなく、null 引数を持つすべてのコンストラクターがこれらのクラスに対して失敗するためです。Db4o.configure().objectClass("java.util.EnumMap").translate(new com.db4o.config.TSerializable()) はもちろん問題を解決します。標準のコレクション フレームワークをサポートする必要があると思います。

4

1 に答える 1

1

db4o で列挙型を使用する場合でも注意が必要です。db4o が enum を格納する方法は非常に危険です。リファクタリングして列挙型を変更すると、その列挙型を db4o に保存したときに、非常に奇妙な動作やバグが発生する可能性があります。列挙型の switch ステートメントが間違った場所にジャンプする可能性があります。

簡単な理由: db4o はオブジェクト インスタンスのように列挙型を格納し、ロード時にリフレクションごとに列挙型の値を設定します。これは、列挙型が変更されることが想定されていないため、非常に奇妙なバグにつながる可能性があります。

(Java)-enum の保存は避け、したがって enum-set も保存しません。

于 2012-12-24T10:25:29.787 に答える