ReActiveAndroid icon indicating copy to clipboard operation
ReActiveAndroid copied to clipboard

How to serialize an array?

Open rmunk opened this issue 6 years ago • 2 comments

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

rmunk avatar Jan 14 '19 10:01 rmunk

I also tried with String[] array and get the same error.

rmunk avatar Jan 14 '19 12:01 rmunk

Did you find a solution?

patoessy avatar Jun 14 '20 13:06 patoessy