立即注册 登录
About云-梭伦科技 返回首页

bob007的个人空间 https://www.aboutyun.com/?1328 [收藏] [复制] [分享] [RSS]

日志

关于 kryo 序列化的持久化问题整理

已有 2794 次阅读2015-11-16 12:36

使用 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






路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条