关于 kryo 序列化的持久化问题!

书一 发布于 2014/02/12 15:34
阅读 8K+
收藏 1

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

}



不知道有没有比较好的方法,又不用使用register的方式,来解决这个问题呢!


加载中
0
红薯
红薯

顶下,这个 register 的侵入性太强了,Java 原生的可以通过 serialVersionID 来解决,难道 kryo 不行?

http://stackoverflow.com/questions/12277193/automatic-class-registration-in-kryo

返回顶部
顶部