2011-12-08 11 views
0

私は基本的なセーブ/オープニング機能を持つJavaアプリケーションを作っています。保存する必要があるのは、クラスのインスタンスです。ModeleImageシングルトンです。私の保存は明らかに動作し、このように見えます:ObjectInputStreamを使用して既存のSingletonオブジェクトを保存されたファイルから置き換えるにはどうすればよいですか?

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()の仕組みを誤解していますか?

+0

編集:実際に私は私のシリアライゼーションが単に私が保存しようとしているときに動作しないことを知りました。私はテキストエディタで保存したファイルを開こうとしましたが、それは以下で始まります: 'java.io.NotSerializableException' – user1088509

+0

編集2:私のModeleImageクラスでSerializableを実装するのを忘れました。保存されたファイルにはエラーはありませんが、小さな(205バイト)フィールドの名前は含まれていますが、値は含まれていません。フィールドの1つはイメージなので、ファイルはかなり大きいはずです。 – user1088509

答えて

1

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

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

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

0

あなただけが1つのオブジェクトのみを書いたので、一度readObject()を呼び出すする必要があります:あなたは何をすべき

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()); 
+0

問題は、私がSingletonであるModeleImageの新しいインスタンスを作成し、シングルトンパターンを破らないようにしようとしていることです。 – user1088509

+0

あなたは既にこれらのうちの1つをデシリアライズすることによってシングルトンパターンを破っています。だから、シリアン内のフィールドを非直列化オブジェクトのフィールドで更新したいのですか? – Gray

+0

はい、正確です。しかし、私はちょうど私の貯蓄がおそらく問題であることを知った。保存されたファイルに 'java.io.NotSerializableException'エラーが発生します。 – user1088509

0

あなたは、シリアライズクラスのインスタンスをチェックする静的なブロックを持っています。それが見つかると、それをあなたのシングルトンインスタンスに設定します(したがって、ファイルからロードするようにします)。それが見つからない場合(おそらく初めてプログラムが起動している)、インスタンスを作成してそれをあなたのシングルトン変数に代入する必要があります。

セーブメソッドを作成したり作成したりすることはできません。シングルトンを保存するためにfinalizeメソッドをオーバーライドすると、次にクラスがロードされたときにスタティックブロックでチェックできます。

意味がありますか?

+0

シングルトンにステートを格納する理由を私は疑問に思いますが、私はいくつかのドキュメントを読んでみたいです。それは非常に乱雑になる可能性があります。実際には、プロパティファイルなどを使用することができます。おそらく、状態を格納するシングルトンによって管理されるクラスを持つでしょう。シングルトンをシリアライズして、必要に応じて一度データを取得することができます。 –

+0

私はJavaで始まりました。アプリケーションでSingletonを初めて使用しました。明らかにこれは1つであってはならないし、1つである必要もないので、私はシングルトンのパターンを壊すことは気にしません。すべてを再考することなく状態を保存したいだけです。今私の問題は、私のObjectOutputStream/ObjectInputStreamを使用しているようです。私はシリアライゼーションについてあまりよく知らないので、助けにはならない。 – user1088509

+0

これは間違った方法ではありませんが、Javaの学習者であれば、デザインパターンを破ってはいけません。誰も本当にすべきではありません。それは理由のためのパターンです。それを破るために、それはデザインパターンであったという事実から逸脱しています。もう一度、これを間違った方法で取らないでください。あなたを指導するのを手伝っているだけです。 –

0

すなわち

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

この概念は、(http://www.javalobby.org/java/forums/t17491.htmlにうまく説明したりはreadResolveの詳細についてはhttp://docs.oracle.com/javase/1.3/docs/guide/serialization/spec/input.doc6.htmlをチェックアウトされ、単一のインスタンスがしかあることを確認し、そこにプロパティをオーバーライドするために、あなたのシリアライズ可能なシングルトンクラスにはreadResolveを実装)。希望が役立ちます。

関連する問題