我正在尝试使用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);
}
}