經過比較, 比JDK自帶的序列化(Serializable AND Externalizable)要快得多,並且最後得到的Byte Array也要小很多。
但是比較悲劇的是
Threading
Kryo is not thread safe. Each thread should have its own Kryo instance.
難道每次使用都要去new 一個?
用Commons-pools行不行呢
public class PoolableKryoFactory implements PoolableObjectFactory<Kryo> {
private static final Logger logger = LoggerFactory
.getLogger(PoolableKryoFactory.class);
public Kryo makeObject() throws Exception {
logger.debug("makeObject");
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(false);
// ...
return kryo;
}
public void destroyObject(Kryo obj) throws Exception {
}
public boolean validateObject(Kryo obj) {
return true;
}
public void activateObject(Kryo obj) throws Exception {
}
public void passivateObject(Kryo obj) throws Exception {
}
}
private Kryo getKryo() {
if (this.kryoFactory == null) {
this.kryoFactory = new SoftReferenceObjectPool<Kryo>(
new PoolableKryoFactory());
}
try {
return this.kryoFactory.borrowObject();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private void close(Kryo kryo) {
try {
this.kryoFactory.returnObject(kryo);
} catch (Exception ex) {
logger.error("returnObject", ex);
}
}
public byte[] serialize(Object t) throws SerializationException {
Kryo kryo = this.getKryo();
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Output output = new Output(outStream, 512);
kryo.writeClassAndObject(output, t);
output.flush();
return outStream.toByteArray();
} finally {
this.close(kryo);
}
}