How to serialize an array?
ReActiveAndroid Version: 1.4.3
Bug or Feature Request: How to serialize int array?
Description:
I have a column that is of type int[]
:
@Table(name = "Notes", database = AppDatabase.class)
public class Note extends Model {
@PrimaryKey
private Long id;
@Column(name = "title")
private String title;
@Column(name = "text")
private String text;
@Column(name = "color")
private int color;
@Column(name = "numbers")
private int[] numbers;
}
I want to serialize it as String
(e.g. "[1,2,3]") so I made an IntArraySerializer
:
public class IntArraySerializer extends TypeSerializer<int[], String> {
@Nullable
@Override
public String serialize(@Nullable int[] data) {
if (data == null) return null;
return new Gson().toJson(data);
}
@Nullable
@Override
public int[] deserialize(@Nullable String data) {
if (data == null) return null;
return new Gson().fromJson(data, int[].class);
}
}
But when I call ReActiveAndroid.init()
DatabaseConfig appDatabaseConfig = new DatabaseConfig.Builder(AppDatabase.class)
.addModelClasses(Note.class, Folder.class, NoteFolderRelation.class)
.addTypeSerializers(IntArraySerializer.class)
.disableMigrationsChecking()
.build();
ReActiveAndroid.init(new ReActiveConfig.Builder(this)
.addDatabaseConfigs(appDatabaseConfig)
.build());
app crashes with following error:
01-14 11:12:41.862 16691-16691/com.reactiveandroid.sample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.reactiveandroid.sample, PID: 16691
java.lang.RuntimeException: Unable to create application com.reactiveandroid.sample.App: java.lang.RuntimeException: java.lang.ClassCastException: libcore.reflect.GenericArrayTypeImpl cannot be cast to java.lang.Class
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6425)
at android.app.ActivityThread.access$1800(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.RuntimeException: java.lang.ClassCastException: libcore.reflect.GenericArrayTypeImpl cannot be cast to java.lang.Class
at com.reactiveandroid.internal.database.DatabaseInfo.loadTypeSerializers(DatabaseInfo.java:148)
at com.reactiveandroid.internal.database.DatabaseInfo.<init>(DatabaseInfo.java:45)
at com.reactiveandroid.ReActiveAndroid.init(ReActiveAndroid.java:53)
at com.reactiveandroid.sample.App.onCreate(App.java:80)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1037)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6422)
at android.app.ActivityThread.access$1800(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.ClassCastException: libcore.reflect.GenericArrayTypeImpl cannot be cast to java.lang.Class
at com.reactiveandroid.internal.serializer.TypeSerializer.<init>(TypeSerializer.java:21)
at com.reactiveandroid.sample.utils.IntArraySerializer.<init>(IntArraySerializer.java:0)
at java.lang.Class.newInstance(Native Method)
at com.reactiveandroid.internal.database.DatabaseInfo.loadTypeSerializers(DatabaseInfo.java:137)
at com.reactiveandroid.internal.database.DatabaseInfo.<init>(DatabaseInfo.java:45)
at com.reactiveandroid.ReActiveAndroid.init(ReActiveAndroid.java:53)
at com.reactiveandroid.sample.App.onCreate(App.java:80)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1037)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6422)
at android.app.ActivityThread.access$1800(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
P.S. This worked in https://github.com/pardom-zz/ActiveAndroid