Kryo没有抛出正确的异常

我正在尝试使用kryo序列化将记录存储在我的Redis集群中。主要是减少存储记录的大小。我正在做一些测试。

我插入了一条记录。一切顺利。能够检索相同内容而没有错误。然后,我从POJO类中删除了一个字段,并尝试检索相同的记录。然后反序列化失败。我进行了调试,发现这些字段正在针对错误的字段反序列化。

我将引用设置为true,将寄存器设置为true。我已经注册了序列化程序可能遇到的所有可能的类。

下面是我的序列化器代码:

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,32) {
        @Override
        protected Output create() {
            return new Output(new ByteArrayOutputStream());
        }
    };

    Pool<Input> inputPool = new Pool<Input>(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);
    }
}
iCMS 回答:Kryo没有抛出正确的异常

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1816194.html

大家都在问