rehacktive / waspdb

key/value data storage library for Android, pure java and encrypted

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

kryo.KryoException: Error constructing instance of class

yatw opened this issue · comments

I can't get a simple example working. It has problem getting back the User class from disk.
From README

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String path = getFilesDir().getPath();
        String databaseName = "myDb";
        String password = "passw0rd";

        WaspDb db = WaspFactory.openOrCreateDatabase(path,databaseName,password);
        WaspHash users = db.openOrCreateHash("users");
        User p = new User();
        users.put("user1", p);
        TextView mytext = findViewById(R.id.mytext);
        mytext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //List<User> allUsers = users.getAllValues();  // return null
                List<String> keys = users.getAllKeys(); // return null
                Log.i(TAG, keys.size()+"");
            }
        });
    }
class User {
    private String username;
    private String email;
    private String telephone;
    //private Address address;
    public User() {
    }
}

Exception

W/System.err: com.esotericsoftware.kryo.KryoException: Error constructing instance of class: com.example.frontenddb.User
W/System.err:     at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$2.newInstance(Kryo.java:1262)
        at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1090)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:570)
        at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:546)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:790)
        at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:161)
        at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:39)
        at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:686)
        at net.rehacktive.waspdb.internals.collision.KryoStoreUtils.unserialize(KryoStoreUtils.java:101)
        at net.rehacktive.waspdb.internals.collision.KryoStoreUtils.readFromDisk(KryoStoreUtils.java:68)
W/System.err:     at net.rehacktive.waspdb.internals.collision.CollisionHash.getAllKeys(CollisionHash.java:103)
        at net.rehacktive.waspdb.WaspHash.getAllKeys(WaspHash.java:95)
        at com.example.frontenddb.MainActivity$1.onClick(MainActivity.java:39)
        at android.view.View.performClick(View.java:7869)
        at android.widget.TextView.performClick(TextView.java:14958)
        at android.view.View.performClickInternal(View.java:7838)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29362)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8107)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
W/System.err: Caused by: java.lang.IllegalAccessException: java.lang.Class<com.example.frontenddb.User> is not accessible from java.lang.Class<com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$2>
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy$2.newInstance(Kryo.java:1260)
    	... 24 more
    java.lang.Exception: 
    ERROR on readFromDisk:Error constructing instance of class: com.example.frontenddb.User
        at net.rehacktive.waspdb.internals.collision.KryoStoreUtils.readFromDisk(KryoStoreUtils.java:87)
W/System.err:     at net.rehacktive.waspdb.internals.collision.CollisionHash.getAllKeys(CollisionHash.java:103)
        at net.rehacktive.waspdb.WaspHash.getAllKeys(WaspHash.java:95)
        at com.example.frontenddb.MainActivity$1.onClick(MainActivity.java:39)
        at android.view.View.performClick(View.java:7869)
        at android.widget.TextView.performClick(TextView.java:14958)
        at android.view.View.performClickInternal(View.java:7838)
        at android.view.View.access$3600(View.java:886)
        at android.view.View$PerformClick.run(View.java:29362)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8107)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
D/AndroidRuntime: Shutting down VM

User class need to have a public keyword