2

さて、私は私のアプリの同じバージョンを持っています、コード構造はまったく変更されていません。アプリの現在の市場バージョンをダウンロードし、いくつかのデータをシリアル化してデータベースに保存します。アプリで問題なく再開できます。

問題は、アプリの新しいバージョンを作成して署名し、アプリをアップグレードすると、逆シリアル化しようとすると次の例外が発生することです。

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();
}
4

0 に答える 0