关于 kryo 序列化的持久化问题!
使用 kryo 进行序列化的速度的确很快!但是在序列化之后的持久化问题上有一些问题发生。
序列化之后的对象保存在redis上,如果redis存在旧的序列化的数据,那么在tomcat启动的时候,运行项目,就会出现这种错误。
要想正常启动运行就必须清除原来的redis缓存,这自然是不行的。
从错误可以看出是class ID不一致的问题。因为没有使用
kryo.register(someclassB.class, 111);这种方式来 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; } } } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
顶下,这个 register 的侵入性太强了,Java 原生的可以通过 serialVersionID 来解决,难道 kryo 不行?
http://stackoverflow.com/questions/12277193/automatic-class-registration-in-kryo