Kryo序列化
新版kryo提供了工厂类和序列化池,不用自己实现序列化池了。
工场类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.pool.KryoFactory;
import java.util.HashMap;
public class CustomKryoFactory implements KryoFactory { private HashMap<Class, Serializer> registerMap;
@Override public Kryo create() { Kryo kryo = new Kryo(); if (null != registerMap && registerMap.size() > 0) { registerMap.forEach((k, v) -> { if (v != null) { kryo.register(k, v); } else { kryo.register(k); } }); } return kryo; }
public HashMap<Class, Serializer> getRegisterMap() { return registerMap; }
public void setRegisterMap(HashMap<Class, Serializer> registerMap) { this.registerMap = registerMap; } }
|
序列化器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.pool.KryoPool;
import java.io.ByteArrayOutputStream; import java.io.IOException;
public class KryoSerializer { private CustomKryoFactory factory; private KryoPool pool;
public KryoSerializer(CustomKryoFactory factory) { this.factory = factory; this.pool = new KryoPool.Builder(factory).build(); }
public byte[] serialize(Object obj) throws IOException { byte[] bytes; try { Kryo kryo = pool.borrow(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Output output = new Output(outputStream); kryo.writeClassAndObject(output, obj); pool.release(kryo); output.close(); bytes = outputStream.toByteArray(); output = null; outputStream = null; } finally { obj = null; } return bytes; }
public Object deserialize(byte[] bytes) throws IOException { if (bytes != null && bytes.length != 0) { Object obj; try { Kryo kryo = pool.borrow(); Input input = new Input(bytes, 0, bytes.length); obj = kryo.readClassAndObject(input); input.close(); pool.release(kryo); } finally { bytes = null; } return obj; } else { return null; } } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import cn.lvkebang.xmall.common.lang.StringSeriesTools; import org.apache.shiro.util.Assert;
public class KryoTest {
public static void main(String[] args) throws Exception{ String str= StringSeriesTools.getRanDomStr(8,1); CustomKryoFactory factory=new CustomKryoFactory(); KryoSerializer serializer=new KryoSerializer(factory); byte[] bytes=serializer.serialize(str); Object obj=serializer.deserialize(bytes); Assert.isTrue(str.equals(obj.toString())); } }
|