2009-08-21 19 views
4

RDBMSまたはキー値ストアに値として格納するためにシリアライズする必要のある単純なJavaクラスがあります。このクラスは、単純型(ネイティブ型またはネイティブ型のマップ/リスト)のプロパティのコレクションに過ぎません。問題は、クラスが時間の経過とともに進化していく可能性が高いことです(新規プロパティの追加、可能性は低いが可能性:プロパティの名前の変更、プロパティのタイプの変更、プロパティの削除など)。Javaでバージョン管理されたシリアル化

私は、クラスのバージョンの変更を正常に処理できるようにしたいと考えています。具体的には、古いバージョンからインスタンスを逆シリアル化しようとすると、古いインスタンスから新しいバージョンへの移行を管理するためのハンドラを指定できるようにしたいと考えています。

Javaの組み込みシリアル化はここでは適切ではないと思います。私自身のソリューションをロールしようとする前に、誰かが助けてくれる既存のライブラリを知っているのだろうかと思います。私は、Javaのための代替シリアル化メソッドのトンを知っていますが、私は時間の経過とともにクラス定義への変更を適切に処理できるようなものを探しています。

編集:それは価値がある何のため

、私はプロトコルバッファ(http://code.google.com/p/protobuf/)シリアライズと一緒に行くことになった、コードの小さい部分でありながら、それは、フィールドを追加し、名前の変更への柔軟なので、私は(維持する必要がreadObject/writeObjectを使用したカスタムJavaシリアル化を参照してください)。

答えて

4

Javaシリアル化では、readObjectwriteObjectメソッドを提供することでシリアルフォームをカスタマイズできます。 ObjectInputStream.readFieldsObjectOutputStrean.putFieldsとともに、serialPersistentFieldsを定義すると、シリアライズされたフォームは、実装クラスの実際のフィールドとは無関係です。

しかし、Javaのシリアライズでは、他の手法で読み書きすることができない不透明なデータが生成されます。

+0

私はreadFieldsメソッドとputFieldsメソッドを認識していませんでした。 –

0

私にも同様の問題がありました。私はJavaのserialVersionUIDが複数のバージョンのオブジェクトを持っている場合にはあまり役に立ちません。だから私は自分のものを出した。ここで

は、私は私達のユーザーセッションを保存するために何をすべきかです、私のDBで

  1. は、シリアライズされたオブジェクトのためのBLOBフィールドのほかに、私はバージョン列を追加しました。
  2. セッションオブジェクトを変更するたびに、古いクラス(SessionV3など)を保存します。
  3. セッションは常に現在のバージョン番号でDBに書き込まれます。
  4. セッションを読み込むときに、バージョンが最新の場合はセッションオブジェクトに直接的に逆シリアル化されます。それ以外の場合は、古いオブジェクトに逆シリアル化され、現在のセッションオブジェクト(SessionV3 => Session)に手動でコピーされます。
  5. しばらくしてから、DBスクリプトを実行して実際の古いセッションバージョンを削除して、コードから古いセッションを削除することができます。古いセッションを気にしていれば、それを変換することもできます。

これを行う簡単な方法があるかもしれませんが、私たちのアプローチは最も柔軟性があります。

0

デシリアライズされているオブジェクトに対して、実行時にクラスファイルの正しいバージョンをロードするためにカスタムブートローダで何かできることがあります。

2

おそらく、Javaクラスをリレーショナル・モデルにマップする必要があります。言語のシリアライズされたBLOBをデータベース列にダンプするのは恐ろしいアプローチです。

+0

標準的なオブジェクトリレーショナルマッピングを使用したくない理由はいくつかあります。 1)シリアル化されたクラスには、リストと値のマップである多数のプロパティがあります。これらをSQLで表現することは可能ですが、特にクラススキーマの変更をうまく処理するためには、dbスキーマの複雑さが増します。 2)値が私のシリアライズされたクラスであるキー値ストアモデルに切り替えるのに十分な柔軟性を保ちたい。 –

1

これは、読み書きオブジェクトを使うとかなり簡単です。

serialversionuidを固定値に設定してから、ご使用のバージョンの静的最終フィールドを定義してください。 readオブジェクトは、switch文を使用して、バージョンに応じてフィールドを構築できます。これを使用して、履歴データをファイルシステムに保存します。それは検索で非常に速いので、ユーザーが違いを知ることはできません。

関連する問題