2016-04-07 4 views
0

私はクラスを持っている、クラス全体を直列化するSavable。それは簡単で素早いものでした。残念ながら、私は私のアプリを更新したい場合、これは問題です。 をSaveableまたはその子孫に変更した場合、インスタンスが古いバージョンから非直列化されると、仮想エラーや抽象エラー、その他のエラーがスローされます。Androidのジレンマを保存するには、間違っているシリアル化を使用していた

Androidの保存データページhereを読むと、開発者はリストされている方法のいずれかを使用することになっています。私はアラームアプリケーションを構築しているので、私はSQLLiteオプションを選択しました。

これまでの問題は、私のアプリケーションが私のSaveableクラスを念頭に置いて作成されていることです。データベースに切り替えるには、Alarmクラスの完全な再作成が必要です。これは、AlarmにSaveableの他の子孫があるためです。したがって、各アラームを保存するには、Saveableの各サブクラスごとにデータベースが必要です。

現在、私はオブジェクトを満たすように直列化するメソッドSaveable.save(Context context)を持っています。これは、アラームクラス全体をシリアル化する代わりに、コアのアラームを保存する必要があるため、書き直しが必要になります。Alarm.db、Saveableのサブクラスをsubclass.dbに埋め込む必要があります。

これは、読み込み時に別の問題が発生します。私はSaveable.LOAD(File path)というメソッドを持っています。このメソッドは、元のクラスにキャストできるSaveableオブジェクトを逆シリアル化します。今度は、Alarmクラスには別のDBに保存する必要がある他のSaveableオブジェクトが含まれているため、Alarmクラスはalarm内の各サブ保存可能クラスへの参照を必要とします。

言うまでもなく、これは爆発的に乱雑になります。私は仕事に賛成ではない(プログラミングはすばらしい)が、私が自分自身を短く変更する前に、あなたはこの問題を解決する方法ですか?

+0

あなたのアプローチ全体を取り戻すことをお勧めします。実際に何をしようとしていますか?クラスのシリアライズは解決策ですが、何が問題なのですか? *任意の*形式でクラスをシリアライズすると、このような問題が発生します。そのため、一般的には素晴らしいアイデアではありません。それは素早く節約するように思えますが、ほとんどいつでもあなたを噛みついてしまいます。 –

+0

@GabeSechanクラスを適切な保存方法に更新しようとしています。そのため、更新するたびに、シリアライズ可能クラスを変更したため、人のセービングデータを消去したり、クラッシュする危険がありません。 –

答えて

0

私は新しいプログラマですが、オブジェクト/クラスをコマンドラインに入れて、serialver class nameと入力すると更新されたバージョンで使用できるようにするためのシリアル化コードを取得できませんstatic final longserialVersionUIDを取り出します。次に、シリアル化してプログラムの更新版で使用するクラスで、static final final serialVersionUID =(コマンドラインがここに与えたランダムな長い番号を挿入)を行います。あなたはすでにこれを知っているかもしれませんが、あなたが探している答えではないかもしれませんが、クラスをシリアライズし、ソースコードを更新し、クラスをデシリアライズして、更新されたコードでそれを使用することについて、

関連する問題