kryo icon indicating copy to clipboard operation
kryo copied to clipboard

Class cannot be created (missing no-arg constructor): com.persistence.IterablePersistenceEntry

Open skyHu666 opened this issue 3 years ago • 3 comments

**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;
}

skyHu666 avatar Sep 13 '22 07:09 skyHu666

Please see the docs about object instantiation.

You can use kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); to instantiate objects without default constructors.

theigl avatar Sep 13 '22 09:09 theigl

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)

skyHu666 avatar Sep 13 '22 09:09 skyHu666

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.

theigl avatar Sep 13 '22 09:09 theigl

When I find that:

ImmutableSetSerializer.registerSerializers(kryo)

The error disappears because my map stores an Immutable。 Thank you

skyHu666 avatar Sep 24 '22 06:09 skyHu666