さて、私は私のアプリの同じバージョンを持っています、コード構造はまったく変更されていません。アプリの現在の市場バージョンをダウンロードし、いくつかのデータをシリアル化してデータベースに保存します。アプリで問題なく再開できます。
問題は、アプリの新しいバージョンを作成して署名し、アプリをアップグレードすると、逆シリアル化しようとすると次の例外が発生することです。
java.lang.IllegalArgumentException: expected receiver of type java.util.ArrayList, but got org.myApp.h.d
org.MyApp.hdは実際にはorg.MyApp.SingleFrameです:
public final class SingleFrame implements Serializable
{
private static final long serialVersionUID = 1L;
public int Position;
public int FrameNumber;
public String TimeStamp;
public Map<Integer,String> MainDataMap;
public Map<Integer,String> DataMap;
public SingleFrame()
{
}
}
そして、これがその親クラスです(シリアル化および逆シリアル化されるクラス、単なるSingleFrameのコレクション):
public class DataLog extends ArrayList<SingleFrame> implements Serializable
{
private static final long serialVersionUID = 1L;
public DataLog ()
{
}
}
アプリをデバッグすれば、すべて問題ありません。問題は、バージョンをビルドし、データを保存してから、新しいバージョンをビルドするときです...アプリをupdataしてから、古い保存データを開こう(逆シリアル化)しようとします。
これが私のプロガード設定です:
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}