You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If an object implements Externalizable and is registered with the ExternalizableSerializer, there is no way for it to call kryo.reference() on itself and the ExternalizableSerializer doesn't do this either. As a consequence, if the Externalizable attempts to read a reference to itself, it will get null and deserialize incorrectly.
To Reproduce
Provide a minimal reproducible example of the problem, ideally in the form of a runnable test-case.
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.ExternalizableSerializer;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class ExternalizableBugProof {
static class Example implements Externalizable {
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF("abc");
out.writeObject(this);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
in.readUTF();
Object obj = in.readObject();
assert obj == this : "" + obj;
}
}
public static void main(String[] args) {
var kryo = new Kryo();
kryo.setReferences(true);
kryo.setRegistrationRequired(false);
kryo.addDefaultSerializer(ExternalizableBugProof.Example.class, ExternalizableSerializer.class);
var output = new Output(1024);
kryo.writeObject(output, new Example());
kryo.readObject(new Input(output.getBuffer()), Example.class);
}
}
Environment:
Kryo 5.6.0
The text was updated successfully, but these errors were encountered:
The ExternalizableSerializer has not been touched in a very long time. I'm guessing that not many people are using it. What use case do you have that prevents you from using FieldSerializer or KryoSerializable?
Describe the bug
If an object implements
Externalizable
and is registered with theExternalizableSerializer
, there is no way for it to callkryo.reference()
on itself and theExternalizableSerializer
doesn't do this either. As a consequence, if theExternalizable
attempts to read a reference to itself, it will getnull
and deserialize incorrectly.To Reproduce
Provide a minimal reproducible example of the problem, ideally in the form of a runnable test-case.
Environment:
Kryo 5.6.0
The text was updated successfully, but these errors were encountered: