2016-05-21 7 views
0

プロジェクト内でオブジェクトを直列化および逆シリアル化する際に問題が発生します。オブジェクトをname.datファイルに書き込んでいます。 しかし、私はNameクラスに変更を加えるたびに、それは2つの異なるオブジェクトであるため、それを非直列化することはできません。古いオブジェクトのJava非直列化

これを回避する手段はありますか?

+0

私はそれを理解しました! –

+0

これは2つの異なる*クラス*です。エラーメッセージは、あなたが行う必要があることをあなたにほとんど伝えます。 – EJP

+1

これは、Javaのビルトインシリアル化メカニズムがデータの長期保存にはあまり適していない理由です。データを格納するには、XMLやJSONなどの標準形式を使用します。 – Jesper

答えて

1

あなたの最良のオプションは以下のとおりです。

  1. 任意のシリアライズされたオブジェクト離れ
  2. スロー:-)あなたのクラスを変更するたびに、あなたのクラスを変更しないでください。
  3. Javaオブジェクトの直列化を使用しないでください。

1)と2)がおそらく問題にならないとすれば、オプション3)は真剣に考慮する必要があります。永続化しているデータの性質に応じて、Javaの直列化に代わるさまざまな方法があります。これらを含める:Javaプロパティを使用して

  • は、XMLを使用したり、そのような
  • にHibernateなどのオブジェクト・リレーショナル・データベースのマッピングを使用して
  • (SQLおよびJDBCのAPIを使用して)、古典的なデータベースにデータを格納する
  • をファイルJSONとPOJOをシリアライズ/デシリアライズできるように "バインディング"テクノロジーを提供しています。

最後に、Javaオブジェクトの直列化を使用して、クラスのバージョン管理を実現することができます。しかし、それは難しいです。そしてあなたがクラスを絶えず変えているなら、それは楽しいものにならないでしょう。最初にVersioning of Serializable Objectsを読んでください。

+1

4. 'static final long serialVersionUID = 1L;'または古い値が何であったか。 – EJP

+0

はい...あなたは互換性のない変更を行うまで、すべてが梨の形になります。そう、本当に、いいえ。 –

+0

あなたのためにこれほどTahnk!静的final long serialVersionUID = 1Lを追加するほうが簡単ですが、 :) –

関連する問題