Крио не выбрасывает правильные исключения - PullRequest
0 голосов
/ 03 августа 2020

Я пробовал сериализацию 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);
    }
}
...