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