私は、バージョン管理システムのクラス構造に柔軟性を持たせるために、さまざまなオプションを検討しています。私に言う必要がある)。readClassDescriptor()とresolveClass()を使用してシリアル化のバージョン管理を有効にする
たとえば、下位互換性のみが必要な場合は、デフォルトのシリアル化メカニズムでフィールドの追加と削除の両方を処理できます。
クラスの名前を変更したり、別のパッケージに移動したりするのはずっと難しくなっています。私はObjectInputStreamのとオーバーライドreadClassDescriptor()をサブクラス化することで、私はパッケージを単純なクラス名の変更を行うこと、および/または移動することができましたthis questionで見つかった:簡単なリネームの罰金です
if (resultClassDescriptor.getName().equals("package.OldClass"))
resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);
。しかし、フィールドを追加または削除しようとすると、java.io.StreamCorruptedExceptionが発生します。さらに悪いことに、フィールドが追加または削除されたとしても、とという名前を変更すると、複数の開発者や複数のチェックインで問題が発生する可能性があります。
私が行ったいくつかの読解に基づいて、私は新しいクラスに正しく名前を再命名したが、古いクラス自体を読み込んでフィールドに爆破しないという考えで、resolveClass()をオーバーライドして少し実験しました変更。しかし、これはシリアライゼーションの仕組みの詳細をあいまいに理解していることから来ており、私が正しいツリーを吠えているかどうかはわかりません。
SO 2の正確な質問:
-
なぜreadClassDescriptorを使用して、クラス名() 直列化復元は、通常、互換性のあるクラスの変更に失敗する原因をrepointingさ
- ?
- を回避するためにresolveClass()または別のメカニズムを使用する方法がありますか?また、クラスの進化(フィールドの追加と削除)と の名前の変更/
私は覗き込んでいて、それに相当する質問は見つかりませんでした。是非、私にそのような質問がある場合はそれを指摘してください。他の質問が私の正確な質問に実際に答えなければ、あなたは私を閉じないでください。
あなたは解決策を見つけましたか? – gaponov
@orbfishあなたが見つけたら解決策を教えてください – Tenacious
@ enthu-manどういうわけか、これを閉じるのを忘れてしまいました。それは長い時間がかかり、問題のコードはもうありません。ここで3つのすっきりしたソリューションがあります。私はそれらを試してみましょう。作品が見つかったら、それを受け入れます; – orbfish