Java:オブジェクトをテキストファイルに保存しますか?既製のソリューションはありますか?

StackOverflow https://stackoverflow.com/questions/170554

  •  05-07-2019
  •  | 
  •  

質問

プログラムで生成したオブジェクトを保存したい。再起動後、アプリは配列内のすべてのオブジェクトを自動的にロードします。それらをファイルに書き込み、再起動後に解析したい。他のスマートな可能性は、手作業で行うよりも賢明ですか? ありがとう

役に立ちましたか?

解決

Berkeley DB PersistentMap クラスを使用して、( Serializable )オブジェクトを Map 実装に保存できます(キャッシュ)ファイルに保持します。使い方はとても簡単で、どこに保存するかを心配する必要はありません。

シリアル化に関する3つの注意事項:

  1. スキーマの変更(つまり、クラスの構成データの変更-新しいフィールドの追加など)にどのように対処しますか
  2. ファイルが破損した場合はどうなりますか?プログラムのストレージの信頼性に応じて、オブジェクトに暗黙的に含まれるデータの保存方法の決定に影響します。いつでも MySQL などのリレーショナルデータベースを使用してから、このデータをオブジェクトに変換できます
  3. プログラムの外部データを表示または照会できる必要がありますか? 「プロパティ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のプロトコルバッファがオブジェクトを保存する方法は、元のシリアル化方法よりも優れています。見てみてください、あなたはそれを気に入るはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top