Reputation: 684
I have a problem with a Serializable object which throws IOException when I try to unserialize it.
The exception message is :
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)
It is preceded by this exception :
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)
The exception seems to be self-explanatory but it is not. In my Serializable class I do have a constructor which takes an ObjectInputStream and the application does work like a charm when i compile it with the debug key. The problem appears when I compile it in release mode so I bet it is an issue with ProGuard or something like that.
Upvotes: 2
Views: 559
Reputation: 13932
try adding to your proguard rules:
-keep class com.andryr.** { *; }
And if this does not work you can try keeping all Serializable class specifics like default constructor and Overrides via:
-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();
}
http://proguard.sourceforge.net/manual/examples.html#serializable
Upvotes: 3