Я пробовал сериализацию kryo для хранения записей в моем кластере redis. В основном для уменьшения размера хранимых записей. Я проводил некоторое тестирование.
Я вставил запись. Это прошло успешно. Смог получить то же самое без ошибок. Затем я удалил поле из класса POJO и попытался получить ту же запись. Тогда десериализация не удалась. Я отлаживал и обнаружил, что поля десериализуются по неправильным полям.
У меня есть ссылки, для которых установлено значение «истина», а для регистра - значение «истина». Я зарегистрировал все возможные классы, с которыми может столкнуться сериализатор.
Ниже мой код сериализатора:
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.util.Pool;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
public class KryoSerializer<T> implements RedisSerializer<T> {
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
private Pool<Kryo> kryoPool = new Pool<Kryo>(true, true, 32) {
@Override
protected Kryo create() {
Kryo kryo = new Kryo();
kryo.setReferences(true);
registerClasses(kryo);
return kryo;
}
};
Pool<Output> outputPool = new Pool<Output>(true, true, 32) {
@Override
protected Output create() {
return new Output(new ByteArrayOutputStream());
}
};
Pool<Input> inputPool = new Pool<Input>(true, true, 32) {
@Override
protected Input create() {
return new Input();
}
};
private Class<T> clazz;
public KryoSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return EMPTY_BYTE_ARRAY;
}
Kryo kryo = kryoPool.obtain();
Output output = outputPool.obtain();
try {
kryo.writeClassAndObject(output, t);
output.flush();
return ((ByteArrayOutputStream) output.getOutputStream())
.toByteArray();
} finally {
kryoPool.free(kryo);
outputPool.free(output);
}
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
Kryo kryo = kryoPool.obtain();
Input input = inputPool.obtain();
try {
input.setBuffer(bytes);
return (T) kryo.readClassAndObject(input);
} finally {
kryoPool.free(kryo);
inputPool.free(input);
}
}
private void registerClasses(Kryo kryo) {
//all the project specific classes are also registered here (not shown)
kryo.register(ArrayList.class);
}
}