プログラムで生成したオブジェクトを保存したい。再起動後、アプリは配列内のすべてのオブジェクトを自動的にロードする必要があります。それらをファイルに書き込み、再起動後に解析したい。手で行うよりも賢明な可能性はありますか? ありがとうございました
8 に答える
はい、あなたが探している概念はシリアル化と呼ばれます。Sun の優れたチュートリアルがここにあります。
永続化するクラスは、Serializable インターフェイスを実装する必要があるという考えです。その後、java.io.ObjectOutputStream.writeObject() を使用してオブジェクトをファイルに書き込み、java.io.ObjectInputStream.readObject() を使用してそれを読み戻します。
シリアル化する意味がないものがあるため、すべてをシリアル化することはできませんが、それらを回避することはできます。これについての引用は次のとおりです。
Java シリアライゼーションの基本的なメカニズムは簡単に使用できますが、知っておくべきことがいくつかあります。前述のように、Serializable とマークされたオブジェクトのみを永続化できます。java.lang.Object クラスはそのインターフェースを実装していません。したがって、Java のすべてのオブジェクトを自動的に永続化できるわけではありません。幸いなことに、それらのほとんど (AWT や Swing GUI コンポーネント、文字列、配列など) はシリアライズ可能です。
一方、Thread、OutputStream とそのサブクラス、Socket などの特定のシステムレベル クラスはシリアライズできません。確かに、そうであったとしても意味がありません。たとえば、私の JVM で実行されているスレッドはシステムのメモリを使用しています。それを永続化して JVM で実行しようとしても、まったく意味がありません。Serializable インターフェースを実装しない java.lang.Object に関するもう 1 つの重要な点は、(前の例で行ったように) 自分でインターフェースを実装しない限り、Object のみを拡張する (他のシリアライズ可能なクラスを拡張しない) クラスはシリアライズできないということです。
この状況は問題を引き起こします: Thread のインスタンスを含むクラスがある場合はどうなるでしょうか? その場合、そのタイプのオブジェクトを永続化できますか? クラスの Thread オブジェクトを一時的なものとしてマークすることでシリアライゼーション メカニズムに意図を伝える限り、答えはイエスです。
Berkeley DB PersistentMap
クラスを使用して、オブジェクトをファイルに永続化する実装(キャッシュ)に( Serializable
)オブジェクトを保存できます。Map
使い方はとても簡単で、何をどこに保存するかを心配する必要はありません。
シリアル化について注意すべき3つのこと:
- スキーマの変更にどのように対処しますか(つまり、クラスが構成するデータを変更する-たとえば、新しいフィールドを追加する)
- ファイルが破損した場合はどうなりますか?プログラムのストレージの信頼性に応じて、オブジェクトに暗黙的に含まれるデータを保存する方法の決定に影響します。MySQLなどのリレーショナルデータベースをいつでも使用して、このデータをオブジェクトに変換できることを忘れないでください
- プログラムの外部でデータを表示または照会できる必要がありますか?「プロパティXを持つオブジェクトはいくつありますか?」などの簡単な質問に答えたい場合はどうでしょうか。(リレーショナル)データベースを使用したことがあれば、簡単に実行できます。ものをファイルにシリアル化した場合、それほど簡単ではありません!
シリアル化に関するいくつかの落とし穴については、EffectiveJavaを確認することをお勧めします。これらは一般的に高度ですが、この機能がアプリのコア部分である場合は、事前にそれらについて知っておく必要があります。
例としては、セキュリティ上の懸念、継承、そして最も重要なこととして、APIを実現することでAPIを公に「フリーズ」する可能性があります(たとえば、ソフトウェアのバージョン間で)。繰り返しますが、これらはすべて高度であり、それ自体を思いとどまらせるべきではありません。
私はそれを使用していませんが、GoogleCodeは最近protobufをリリースしました。
java.io.Object[Input/Output]Stream は、確認する必要がある 2 つのクラスです。
ファイルに永続化したいクラスは、java.io.Serializable インターフェイスを実装する必要があります。
また、シリアル化よりも耐久性が高いと思われる XML エンコーディングの使用を検討することもできます。java.beans.XMLEncoder/XMLDecoder
クラスを使用します。
なぜ誰もJSONや、たとえばJackson JSON serializerについて言及しなかったのだろうか。