虽然网上说这个序列化工具ProtoStuff (http://www.protostuff.io/)有多么的快,多么牛,但是在我们公司使用的时候发现反序列化的问题:
1.例如一个User类 对象通过字节数组 序列化字节数组
2.问题出现了,当我对user对象加一个属性字段email,这时候发现使用之前老的序列化字节数组 反序列化 为null 报错
经过详细测试,重现了上面的问题,使用这个工具确实有 新增字段 序列化的问题
怎么解决上面的问题:
使用java 原生的序列化 和 反序列化
java 原生序列化:
/**
* object转成byte[]数组
* @param obj
* @return
*/
public static byte[] getBytesFromObject(Object obj) {
ByteArrayOutputStream bo = null;
ObjectOutputStream oo = null;
try {
bo = new ByteArrayOutputStream();
oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
return bo.toByteArray();
} catch (Exception e) {
LOG.error("getBytesFromObject error: {}.", e);
return null;
} finally {
if (bo != null) {
try {
bo.close();
} catch (Exception e) {
}
}
if (oo != null) {
try {
oo.close();
} catch (Exception e) {
}
}
}
}
java 原生反列化:
/**
* byte[]数组转成object
* @param objBytes
* @return
*/
public static Object getObjectFromBytes(byte[] objBytes) {
if (objBytes == null || objBytes.length == 0) {
return null;
}
ByteArrayInputStream bi = null;
ObjectInputStream oi = null;
try {
bi = new ByteArrayInputStream(objBytes);
oi = new ObjectInputStream(bi);
return oi.readObject();
} catch (Exception e) {
LOG.error("getObjectFromBytes error: {}.", e);
return null;
} finally {
if (oi != null) {
try {
oi.close();
} catch (Exception e) {
}
}
if (bi != null) {
try {
bi.close();
} catch (Exception e) {
}
}
}
}