0

基本的な保存/開く機能を持つ Java アプリケーションを作成しています。保存する必要があるのは、Singleton であるクラスModeleImageのインスタンスだけです。私の節約は明らかに機能し、次のようになります。

ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
outputStream.writeObject(ModeleImage.getInstance());
outputStream.flush();
outputStream.close();

今、そのファイルを ObjectInputStream で開こうとしています。シングルトン (ModeleImage) を保存したものに単純に置き換える方法があるかどうかはわかりませんが、現在は各属性をコピーして置き換えるだけです。私のオープニングは次のようになります。

FileInputStream fis = new FileInputStream(fileChooser.getSelectedFile());
ObjectInputStream ois = new ObjectInputStream(fis);

//Get each attribute from the file and set them in my existing ModeleImage Singleton

ModeleImage.getInstance().setImage(((ModeleImage) ois.readObject()).getImage());
ModeleImage.getInstance().setLargeurImage(((ModeleImage) ois.readObject()).getLargeurImage());
ModeleImage.getInstance().setHauteurImage(((ModeleImage) ois.readObject()).getHauteurImage());
ModeleImage.getInstance().setxImage(((ModeleImage) ois.readObject()).getxImage());
ModeleImage.getInstance().setyImage(((ModeleImage) ois.readObject()).getyImage());

また、それぞれに try/catch を配置します。問題は、属性を置き換えようとすると、開始部分が IOException をキャッチすることです。

ModeleImage.getInstance().setImage(((ModeleImage) ois.readObject()).getImage());
//This catches an IOException

私は何を間違っていますか?シングルトンだからですか、それとも ObjectInputStream と readObject() の仕組みを誤解していますか?

4

4 に答える 4

1

シリアル化メカニズムの組み込み機能を使用することにより、クラスファイル内に2つのメソッドを提供することにより、通常のプロセスを強化できます。それらの方法は次のとおりです。

private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

ModeleImageクラスでこのメソッドを実装すると、シリアル化のすべての側面を制御し、シングルトンの内部状態にアクセスできるようになります。

于 2011-12-08T20:50:38.613 に答える
0

実行する必要があるのは、シリアル化したクラスのインスタンスをチェックする静的ブロックを用意することです。可能であれば、それを見つけて、シングルトンインスタンスに設定します(したがって、ファイルからインスタンスをロードするようにしてください)。見つからない場合(おそらくプログラムを初めて起動するとき)、インスタンスを作成してシングルトン変数に割り当てる必要があります。

saveメソッドなどを作成するか、finalizeメソッドをオーバーライドしてシングルトンを保存し、次にクラスがロードされるときに静的ブロックでチェックできるようにすることができます。

わかる?

于 2011-12-08T21:13:17.680 に答える
0

オブジェクトを 1 つしか記述していないため、呼び出しreadObject()は 1 回だけにする必要があります。

ModeleImage image = ois.readObject();
ModeleImage.getInstance().setImage((image.getImage());
ModeleImage.getInstance().setLargeurImage(image.getLargeurImage());
ModeleImage.getInstance().setHauteurImage((image.getHauteurImage());
ModeleImage.getInstance().setxImage(image.getxImage());
ModeleImage.getInstance().setyImage(image.getyImage());
于 2011-12-08T21:01:28.313 に答える
0

シリアル化可能な Singleton クラスに readResolve を実装して、インスタンスが 1 つだけであることを確認し、そこでプロパティをオーバーライドします。

private Object readResolve() throws ObjectStreamException
{
    instance.setImage(getImage());
    instance.setLargeurImage(getLargeurImage());
    ... 
    return instance;
}

この概念は、http://www.javalobby.org/java/forums/t17491.html で詳しく説明されているか、 http: //docs.oracle.com/javase/1.3/docs/guide/serialization/spec/input を確認してください readResolve() の詳細については、doc6.htmlを参照してください。それが役立つことを願っています。

于 2011-12-08T21:37:27.093 に答える