kryo icon indicating copy to clipboard operation
kryo copied to clipboard

in android,private static final class can not be accessible, how to slove it,thanks.

Open kevinkwok326 opened this issue 3 years ago • 7 comments

errMsg=[java.lang.Class<com.badlogic.gdx.ai.btree.BehaviorTree$GuardEvaluator> is not accessible from java.lang.Class<com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy$2>].

As the class is another open source ,we can not modify it, so please help us how to slove it,thanks.

in android run exception, but run normally in linux server

09-05 20:22:04.935 13947 14630 E DMService-run: guardEvaluator (com.badlogic.gdx.ai.btree.BehaviorTree)], stackTrace=[com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy$2.newInstance(DefaultInstantiatorStrategy.java:89) com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1202) com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:163) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122) com.esotericsoftware.kryo.Kryo.readObjectOrNull(Kryo.java:847) com.esotericsoftware.kryo.serializers.ReflectField.read(ReflectField.java:132) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:129) com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:877) ];

kevinkwok326 avatar Sep 05 '22 12:09 kevinkwok326

kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); --- can not work

kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); -- seems work normally

can i use like this ?

kevinkwok326 avatar Sep 06 '22 02:09 kevinkwok326

@kevinkwok326: Yes, you can use StdInstantiatorStrategy directly.

Can you please provide the complete stacktrace you get when you use new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())? Because this should also work. Errors should be caught and the fallback strategy applied.

theigl avatar Sep 06 '22 08:09 theigl

@kevinkwok326: Yes, you can use StdInstantiatorStrategy directly.

Can you please provide the complete stacktrace you get when you use new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())? Because this should also work. Errors should be caught and the fallback strategy applied.

09-05 20:22:04.935 13947 14630 E DMService-run: |uncaughtException: com.esotericsoftware.kryo.KryoException, Error constructing instance of class: com.badlogic.gdx.ai.btree.BehaviorTree$GuardEvaluator 09-05 20:22:04.935 13947 14630 E DMService-run: Serialization trace: 09-05 20:22:04.935 13947 14630 E DMService-run: guardEvaluator (com.badlogic.gdx.ai.btree.BehaviorTree), error Trace; class=[com.esotericsoftware.kryo.KryoException], errMsg=[Error constructing instance of class: com.badlogic.gdx.ai.btree.BehaviorTree$GuardEvaluator 09-05 20:22:04.935 13947 14630 E DMService-run: Serialization trace: 09-05 20:22:04.935 13947 14630 E DMService-run: guardEvaluator (com.badlogic.gdx.ai.btree.BehaviorTree)], stackTrace=[com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy$2.newInstance(DefaultInstantiatorStrategy.java:89) com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1202) com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:163) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122) com.esotericsoftware.kryo.Kryo.readObjectOrNull(Kryo.java:847) com.esotericsoftware.kryo.serializers.ReflectField.read(ReflectField.java:132) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:129) com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:877) ]; class=[java.lang.IllegalAccessException], errMsg=[java.lang.Class<com.badlogic.gdx.ai.btree.BehaviorTree$GuardEvaluator> is not accessible from java.lang.Class<com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy$2>], stackTrace=[com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy$2.newInstance(DefaultInstantiatorStrategy.java:89) com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1202) com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:163) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122) com.esotericsoftware.kryo.Kryo.readObjectOrNull(Kryo.java:847) com.esotericsoftware.kryo.serializers.ReflectField.read(ReflectField.java:132) com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:129) com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:877) ]

kevinkwok326 avatar Sep 08 '22 06:09 kevinkwok326

As I check the DefaultInstantiatorStrategy.java code.

If raised exception at line 89, can not go to fallbackStrategy(ling 96~115)

kevinkwok326 avatar Sep 08 '22 06:09 kevinkwok326

Thanks for the info! I see, the fallback is never applied when the error happens inside the anonymous ObjectInstantiator. We need another fallback logic inside the instantiator, or wrap it with a fallback.

theigl avatar Sep 08 '22 13:09 theigl

Thanks for the info! I see, the fallback is never applied when the error happens inside the anonymous ObjectInstantiator. We need another fallback logic inside the instantiator, or wrap it with a fallback.

Thanks for reply, when will it be fixed?

kevinkwok326 avatar Sep 09 '22 04:09 kevinkwok326

I don't have much time to work on Kryo at the moment, so probably not very soon. You can always create a PR though.

theigl avatar Sep 09 '22 08:09 theigl