使用 kryo 进行序列化的速度的确很快!但是在序列化之后的持久化问题上有一些问题发生。
序列化之后的对象保存在redis上,如果redis存在旧的序列化的数据,那么在tomcat启动的时候,运行项目,就会出现这种错误。
要想正常启动运行就必须清除原来的redis缓存,这自然是不行的。
从错误可以看出是class ID不一致的问题。因为没有使用
这种方式来 register class!不想每次新加一个类都做这种操作。而且还有很多List,Map之类的register问题。
下面是序列化工具类代码:
package net.oschina.j2cache.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import net.sf.ehcache.CacheException;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
public class SerializationUtils {
public final static Kryo kryo = new Kryo();
static {
kryo.setRegistrationRequired(false);
kryo.setMaxDepth(20);
}
public static byte[] serialize(Object obj) {
ByteArrayOutputStream out = null;
Output output = null;
try {
out = new ByteArrayOutputStream();
output = new Output(out, 1024);
kryo.writeClassAndObject(output, obj);
return output.toBytes();
} catch (Exception e) {
throw new CacheException(e);
} finally {
if (null != out) {
try {
out.close();
out = null;
} catch (IOException e) {
}
}
if (null != output) {
output.close();
output = null;
}
}
}
public static Object deserialize(byte[] bytes) {
Input input = null;
try {
input = new Input(bytes, 0, 1024);
return kryo.readClassAndObject(input);
} catch (Exception e) {
throw new CacheException(e);
} finally {
if (null != input) {
input.close();
input = null;
}
}
}
}
回答:
这个 register 的侵入性太强了,Java 原生的可以通过 serialVersionID 来解决,难道 kryo 不行?
http://stackoverflow.com/questions/12277193/automatic-class-registration-in-kryo