4

私は周りを見回しましたが、私がやりたいことを完全にカバーしているようには見えません。Class<?>実行時にインスタンス オブジェクトを保存することはできますか? もしそうなら、どうすればそれを行うことができますか?

4

3 に答える 3

3

Javaを使用したシリアル化の概念を経験しましたか. このリンクは、問題の解決に役立ちます。

つまり、 Java.lang.Serializableはこれを行うための友達です。

于 2012-05-24T14:10:17.990 に答える
2

これは、回答ではなく、Java シリアライゼーションに関する一連のコメントです。他の回答に(まだ)含まれていない情報だけです。

シリアル化は、オブジェクトを保存するだけでなく、それが参照するすべてのオブジェクトを直接的および間接的に保存します。これは非常に素晴らしいことですが、小さなオブジェクトを 1 つ書いただけで、予期せず 10 MB のファイルが作成されたことに気付くかもしれません。

間接的ではありますが、書き込み中のオブジェクトにシリアル化できないオブジェクトへの参照がある場合、書き込みは例外をスローします。

ソケットを使用している場合は、ObjectOutput ストリームを定期的にリセットしてください。そうしないと、最初以外にオブジェクトが書き込まれるたびに、送信されるのは元のデータへの参照だけになります。1、2、3、4、および 5 の連続する値を持つ同じオブジェクトを送信すると、読み取られたオブジェクトの値は 1、1、1、1、および 1 になります。 ObjectInput は、送信されたほとんどすべてをメモリに保持します。(ただし、個別のオブジェクトごとに 1 つのコピーしか保持しません。)

クラスが書き込み中と読み取り中の間で変更された場合、シリアライゼーションは機能しません。ただし、Externalization を巧妙に使用すれば、これを回避できます。(また、IDE で忘れさせてくれる場合は、serialVersionUID を覚えておいてください。)

外部化により、コードを記述してクラスをシリアル化できます。これは非常に便利です。バージョン番号を入れてチェックすることができ、不要なデータや読み取り中に再作成できるデータを除外することができます。ただし、自動シリアル化よりも多くの作業が必要です。

外部化読み取りを行う場合、すべての参照がデータがまだ到着していないオブジェクトを参照している可能性があることに注意してください。たとえば、子オブジェクトのリストから一貫して金額を合計することはできません。計算が必要な値を設定するために、readObject の後にメソッドを呼び出すと費用がかかる場合があります。(多くの場合、再計算するよりも冗長な情報を送信する方が適切です。)

私はこれらすべてを苦労して学びました。

于 2012-05-24T19:05:45.417 に答える
1

このウェブサイトからシリアル化について学びました。コンセプトをしっかり教えてくれます。そこから始めることをお勧めします。

于 2012-05-24T14:16:48.970 に答える