2011-07-05 18 views
4

私はenumを追加したシリアル化されたオブジェクトを持っています。これにより、古いバージョンのソフトウェアとの互換性がなくなります。これは古いバージョンがJava 1.4でコンパイルされているためです。私は得る:enumをシリアライズ

java.io.InvalidClassException: cannot bind enum descriptor to a non-enum class 

私は理想的には、列挙型を置き換え、何らかの形で既存のオブジェクトを修正したいと思います。

アイデアのカップルです:

  1. シリアル化されたオブジェクトを読み込むとき、列挙型を持つフィールドを無視します。値は失われますが、それは問題ありません。

  2. シリアル化されたクラスを2つコピーし、その名前を列挙型に変更し、オブジェクトを新しく名前を変更したクラスに何らかの形で読み込みます。

+9

私は人々が役に立たないコメントでdownvoteするとき、私はそれが嫌いです。 –

+0

シリアル化されたオブジェクトから値を取得するソリューションをお探しですか?あなたの懸念されるシリアル化された値を取得していますか? –

+0

この例外はいつ取得しますか? – skaffman

答えて

0

最も単純な解決策は、新しいコードを使用してシリアライズされたエンティティを読み取り、古いバージョンのソフトウェアが理解できる形式で書き出すことです。もちろん、これが実行可能な解決策でない場合は、要件をもう少し明確にする必要があります。どの部分を変更できるのか、変更できないものなど

3

enumフィールドには、transientとマークするだけです。それはシリアル化されません。
あなたはその価値を失いますが、あなたは気にしないと言いました。

transientはJavaのキーワードです。
はオブジェクトの永続状態の一部とみなされないようにフィールドにフラグを付けます
メンバ変数がバイトストリームに永続化されているときに直列化されないようにマークします。オブジェクトがネットワークを介して転送される場合、オブジェクトは「シリアル化」されている必要があります。シリアライゼーションは、オブジェクトの状態をシリアルバイトに変換します。これらのバイトはネットワーク経由で送信され、オブジェクトはそれらのバイトから再作成されます。 java transientキーワードでマークされたメンバー変数は転送されず、故意に失われます。 [source]

+0

それは彼の問題を助けることはありません。彼はすでにそのフィールドのデータでオブジェクトをシリアライズしています。あなたが提案していることは、Object Versioning Specification#5.6.1に互換性のない変更として記載されています。 – EJP

1

私は古い バージョンはJava 1.4でコンパイルされているためであると考えています。 I get:

いいえJava 1.4.1には列挙型がありませんでした。彼らは1.5に導入されました。起こったように見えるのは、Stringとして直列化されたものがその後Enumに変更されたということです。

理想的には私はあなたの提案された変更はちょうどそれを反転させる文字列で

を 列挙型を交換したいと思います。

となり、何とか既存のオブジェクト を修正します。

既存のシリアライズされたオブジェクトを修正することはできませんが、ソースを元に戻す、またはそれがされている必要があります何を考え出すと、同一のserialVersionUIDを宣言することによって、それに現在のクラスが互換性を持たせることができます。