プロが教える店舗&オフィスのセキュリティ対策術

今までパッケージ管理されていなかったデータオブジェクトをパッケージ管理するよう変更したのですが、クラス名が変更されたことにより旧データオブジェクトの復旧が行えなくなりました。

前データ)
class Data implements Serializable
{
public Data(){}
}

(1)オブジェクトストリームとしてExport。
Data target = new Data();
java.io.FileOutputStream ostream = new java.io.FileOutputStream("C:\\test.data");
java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(ostream);
p.writeObject(target);
p.flush();
ostream.close();

(2)Dataオブジェクトをパッケージ管理に変更
新データ)
package com.corp.etc
class Data implements Serializable
{
public Data(){}
}

(3)(1)でExportしたデータをImport
java.io.FileInputStream istream = new java.io.FileInputStream("C:\\test.data");
java.io.ObjectInputStream p = new java.io.ObjectInputStream(istream);
Object obj = p.readObject();
istream.close();
Data data = (Data)obj;

(3)の実行結果)
java.lang.ClassNotFoundException: Data

クラス名が変わったので、当たり前の動きとは思うのですが、旧データを今までと同じようにインスタンス化するために何か良い方法はありませんでしょうか?

A 回答 (1件)

この状態だと、そのまま受け渡すのは難しそうですね。

おそらく、元のDataクラスを残してインスタンス生成し、それとは別に新しいDataインスタンスをnewして、個々の値をコピーしていくしかないように思えます。

今からプログラムの修正がきくかどうかわかりませんが、今はObjectOutputStream/ObjectInputStreamは使わず、XMLEncoder/XMLDecoderのwriteObject/readObjectを使ってXMLファイルとしてオブジェクトを保存するのが一般的だろうと思います。これなら、いざとなれば直接XMLファイルを編集して内容を修正できますし。

面倒ですが、元のDataをXML出力の形に修正してインスタンスを書き出し、それから再びパッケージを設定する、ということは難しいでしょうか。

この回答への補足

私の認識だと、XMLEncoder/XMLDecoder は、Java1.5からだっと思うのですが、これはあっていますか?

現在利用しているJavaのJ2SDKはJava1.4.2なので、XMLEncoder/XMLDecoderの利用は断念した経緯があります。
(OSの関係でJava1.5にアップグレードできません)

Java1.4.2に対してXMLEncoder/XMLDecoder を利用できるように設定できれば、良いと思うのですが、拡張ライブラリとかあるのですかね?

補足日時:2007/10/10 12:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!