Class cannot be created (missing no-arg constructor): com.persistence.IterablePersistenceEntry
**com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): com.hivemq.persistence.IterablePersistenceEntry at com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy.newInstantiatorOf(DefaultInstantiatorStrategy.java:111) at com.esotericsoftware.kryo.Kryo.newInstantiator(Kryo.java:1190) at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1199) at com.esotericsoftware.kryo.serializers.FieldSerializer.create(FieldSerializer.java:163) at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122) at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:880) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:235) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:42) at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:777) at com.hivemq.util.KryoUtil.readObject(KryoUtil.java:35)
com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): com.google.common.collect.SingletonImmutableSet**
The following structures are serialized and deserialized:
HashMap<String,IterablePersistenceEntry<?>>
// KryoUtil private static Kryo registerOfAnythings() throws ClassNotFoundException { Kryo kryo = KRYO_THREAD_LOCAL.get(); kryo.setRegistrationRequired(false); kryo.register(Class.forName("java.util.HashMap")); kryo.register(Class.forName("com.hivemq.persistence.IterablePersistenceEntry")); return kryo; }
// class
@Immutable public class IterablePersistenceEntry<T extends Collection<? extends Sizable>> implements Sizable,Serializable{
private static final long serialVersionUID = 3818882198782957715L;
private final long timestamp;
private final @NotNull T object;
private int sizeInMemory = SIZE_NOT_CALCULATED;
public IterablePersistenceEntry(@NotNull final T object, final long timestamp) {
this.timestamp = timestamp;
this.object = object;
}
public long getTimestamp() {
return timestamp;
}
@NotNull
public T getObject() {
return object;
}
Please see the docs about object instantiation.
You can use kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); to instantiate objects without default constructors.
kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()))
Or an error:
com.esotericsoftware.kryo.KryoException: java.lang.UnsupportedOperationException Serialization trace: object (com.hivemq.persistence.IterablePersistenceEntry) at com.esotericsoftware.kryo.serializers.ReflectField.read(ReflectField.java:145) at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:129) at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:880) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:235) at com.esotericsoftware.kryo.serializers.MapSerializer.read(MapSerializer.java:42) at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:880) at com.hivemq.util.KryoUtil.readObject(KryoUtil.java:37)
What is the root cause of this exception? Can you please share the full stack trace?
Or even better, try to replicate this issue in a minimal unit test.
When I find that:
ImmutableSetSerializer.registerSerializers(kryo)
The error disappears because my map stores an Immutable。 Thank you