Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • R ReActiveAndroid
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 18
    • Issues 18
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 1
    • Merge requests 1
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Mahach Imangazaliev
  • ReActiveAndroid
  • Issues
  • #47
Closed
Open
Issue created Jan 14, 2019 by Ranko Munk@rmunk

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

Assignee
Assign to
Time tracking