2012-03-15 8 views
0

質問を繰り返す場合は、事前にお詫びします。 私がいる場合は、関連する投稿に私を転送してください。Java:シリアル化されたオブジェクトを読み取る最良の方法は何ですか?

私はかなりのコンポーネントを持っているJPanelを持っています。これをJFrameに配置します。ユーザーに現在のセッションを保存する機会を与えたい(つまり、サブコンポーネントの値はそのままでJPanelをシリアライズする)。ユーザーは、以前のセッション(基本的にはcomboxes &のテキストフィールドエントリの保存された選択肢を持つJPanelです)を読み込む機会があります。

私の質問は、ファイルからJPanelオブジェクトを読み取ることに関するものです。 ファイルからJPanelを読み込んだら、テキストフィールドとコンボボックスのそれぞれを読み込む必要がありますか、JPanelを保存したJPanelで置き換えるだけでいいですか?

  • 1:私の知る限り、これを行うための唯一の方法は、このような保存されたパネルが現在のパネルを交換することで、うまくできるよう MyPanel savedPanel =(MyPanel)objectInputStream.readObject();
  • 2:remove(currentPanel);
  • 3:add(savedPanel);
  • 4:validate();

これは私が欲しいものを達成するためのものですか?

ありがとうございます。

+1

これを試したときに何が起こりましたか? –

答えて

5

デシリアライゼーションは、保存されたオブジェクトグラフを復元します。ただし、Javadocを参照してください。Swingオブジェクトをシリアル化することは実際には推奨されません。あなたはjava.beans.XMLEncoderを見るかもしれません。

+0

感動的な応答時間、ありがとうございます。私は代わりとしてそれを検討して忙しいです。オブジェクトグラフをシリアライゼーションと別のものに保存しているのですか、どちらもスイングアプリケーションにはアドバイスされていないと言っていますか?ありがとう –

+0

@StevePaul Serialziationはオブジェクトグラフを保存し、逆シリアル化によって復元されます。これは、すべてオブジェクト直列化仕様で指定されています。私はあなたの2番目の質問を理解していません。デシリアライゼーションなしでシリアライズすることはあまり意味がありません。シリアル化せずにデシリアライズすることはできません。直列化* in toto *はSwingオブジェクトでは非推奨で、すべてのSwingクラスのJavadocではsoと書かれています。 – EJP

+0

ああ、私は、Swingオブジェクトではシリアライゼーションが非難されていたことに気づかずにいました。今、私はあなたのtipoffをjava.beans.XMLEncoderに関して理解しています。アドバイスをいただきありがとうございます。 –

0

パネル自体ではなく、スイングパネルのデータを保存します。パネルはユーザーデータではなくプレゼンテーションです。ユーザーデータのみに基づいてパネルの状態を再構築できるはずです。

そのためには、パネルのデータモデルをモデル化したモデルを作成してから、そのモデルのデータを永続化および取得できるようにするXMLまたはJSONシリアライザを調べます。モデルからUIを読み込むと、コード内の十分に含まれている単一のポイントから画面を保存して更新することができます。

関連する問題