Java 具有可序列化对象的IOException

Java 具有可序列化对象的IOException,java,android,serialization,proguard,release,Java,Android,Serialization,Proguard,Release,我有一个可序列化对象的问题,当我尝试取消序列化时,它会抛出IOException 例外消息是: W/System.err( 5258): java.io.IOException: Serializable class must have a (ObjectInputStream in) constructor W/System.err( 5258): at com.andryr.intervaltrainingtimer.c.a.a(Unknown Source) W/System.err

我有一个可序列化对象的问题,当我尝试取消序列化时,它会抛出IOException

例外消息是:

W/System.err( 5258): java.io.IOException: Serializable class must have a (ObjectInputStream in) constructor
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.c.a.a(Unknown Source)
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.data.Workout.a(Unknown Source)
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.EditWorkoutActivity.onCreate(Unknown Source)
W/System.err( 5258):    at android.app.Activity.performCreate(Activity.java:4479)
W/System.err( 5258):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
W/System.err( 5258):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
W/System.err( 5258):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
W/System.err( 5258):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
W/System.err( 5258):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
W/System.err( 5258):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err( 5258):    at android.os.Looper.loop(Looper.java:154)
W/System.err( 5258):    at android.app.ActivityThread.main(ActivityThread.java:4624)
W/System.err( 5258):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 5258):    at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err( 5258):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
W/System.err( 5258):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
W/System.err( 5258):    at dalvik.system.NativeStart.main(Native Method)
它前面有以下例外情况:

W/System.err( 5258): java.lang.NoSuchMethodException: <init> [class com.andryr.intervaltrainingtimer.c.a]
W/System.err( 5258):    at java.lang.Class.getConstructorOrMethod(Class.java:460)
W/System.err( 5258):    at java.lang.Class.getConstructor(Class.java:431)
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.c.a.a(Unknown Source)
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.data.Workout.a(Unknown Source)
W/System.err( 5258):    at com.andryr.intervaltrainingtimer.EditWorkoutActivity.onCreate(Unknown Source)
W/System.err( 5258):    at android.app.Activity.performCreate(Activity.java:4479)
W/System.err( 5258):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
W/System.err( 5258):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
W/System.err( 5258):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
W/System.err( 5258):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
W/System.err( 5258):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
W/System.err( 5258):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err( 5258):    at android.os.Looper.loop(Looper.java:154)
W/System.err( 5258):    at android.app.ActivityThread.main(ActivityThread.java:4624)
W/System.err( 5258):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err( 5258):    at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err( 5258):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
W/System.err( 5258):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
W/System.err( 5258):    at dalvik.system.NativeStart.main(Native Method)
W/System.err(5258):java.lang.NoSuchMethodException:[class com.andryr.intervaltrainingtimer.c.a]
W/System.err(5258):在java.lang.Class.GetConstructorOrmMethod(Class.java:460)中
W/System.err(5258):位于java.lang.Class.getConstructor(Class.java:431)
W/System.err(5258):位于com.andryr.intervaltrainingtimer.c.a.a(未知来源)
W/System.err(5258):位于com.andryr.intervaltrainingtimer.data.Workout.a(未知来源)
W/System.err(5258):位于com.andryr.intervaltrainingtimer.editworkutactivity.onCreate(未知源)
W/System.err(5258):位于android.app.Activity.performCreate(Activity.java:4479)
W/System.err(5258):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
W/System.err(5258):位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
W/System.err(5258):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
W/System.err(5258):位于android.app.ActivityThread.access$600(ActivityThread.java:134)
W/System.err(5258):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
W/System.err(5258):位于android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(5258):位于android.os.Looper.loop(Looper.java:154)
W/System.err(5258):位于android.app.ActivityThread.main(ActivityThread.java:4624)
W/System.err(5258):位于java.lang.reflect.Method.invokenactive(本机方法)
W/System.err(5258):位于java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(5258):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
W/System.err(5258):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
W/System.err(5258):位于dalvik.System.NativeStart.main(本机方法)
这个例外似乎是不言自明的,但事实并非如此。在我的Serializable类中,我有一个构造函数,它接受ObjectInputStream,当我使用debug键编译它时,应用程序确实像一个符咒一样工作。
在发布模式下编译时会出现问题,因此我打赌这是ProGuard或类似的问题。

尝试添加到ProGuard规则中:

-keep class com.andryr.** { *; }
如果这不起作用,您可以尝试通过以下方式保留所有可序列化类细节,如默认构造函数和重写:

 -keepclassmembers class * implements java.io.Serializable {
    public <init>(...);
    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();
}
-keepclassmembers类*实现java.io.Serializable{
公众(……);
私有静态final java.io.ObjectStreamField[]serialPersistentFields;
私有void writeObject(java.io.ObjectOutputStream);
私有void readObject(java.io.ObjectInputStream);
java.lang.Object WriterReplace();
java.lang.Object readResolve();
}