I am getting following error when registering in Kryo.
Caused by: java.lang.IllegalArgumentException: Class is not registered: shared.SharedObjectFactory$Segment[]
Note: To register this class use: kryo.register(shared.SharedObjectFactory$Segment[].class);
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:484)
at com.esotericsoftware.kryo.Kryo.getSerializer(Kryo.java:502)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:83)
... 22 moreEnter code here...
SharedObjectFactory class comes from a third party library. I don't have access it. How could I register private class Segment? I have looked similar another post, but I'm not understanding.
public class SharedObjectFactory{
private final static int DEFAULT_NR_OF_SEGMENTS_BITSIZE = 5;
private final Segment[] segments = new Segment[1];
//...........
private final static class Segment{
//..........
//...........
}
}
Thank you Leo!
But it's not working. I have also look you link, but unable to get any idea.
package firstmpjtest;
public class SharedObjectFactory {
private final static int DEFAULT_NR_OF_SEGMENTS_BITSIZE = 5;
private final Segment[] segments = new Segment[1];
//...........
private final static class Segment{
//..........
//...........
}
} SharedObjectFactory sObj = new SharedObjectFactory();
KryoSerializer.register(SharedObjectFactory.class);
Class clazz = Class.forName("firstmpjtest.SharedObjectFactory$Segment");
KryoSerializer.register(clazz);
byte sByteArray[] = KryoSerializer.write(sObj);
SharedObjectFactory a = (SharedObjectFactory) KryoSerializer.read(sByteArray);public final class KryoSerializer {
private static final Kryo kryo = new Kryo();
static {
kryo.setRegistrationRequired(true);
}
public static void register(Class... classes) {
for(Class clazz : classes) {
kryo.register(clazz);
}
}
public static byte[] write(Object obj) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Output o = new Output(bos);
kryo.writeClassAndObject(o, obj);
return o.toBytes();
}
public static Object read(byte[] bytes) {
Input in = new Input(bytes);
return kryo.readClassAndObject(in);
}
} kryo.register(Array.newInstance(Class.forName("com.esotericsoftware.kryo.PrivateInnerClassTest$ConcreteClass$Segment"), 0)
.getClass());
Yes!
Now it's working. You are right.
This is the key that I was missing earlier.kryo.register(Array.newInstance(Class.forName("com.esotericsoftware.kryo.PrivateInnerClassTest$ConcreteClass$Segment"), 0).getClass());
Thank you so much Leo for your swift support!