JAVA原生序列化
在做redis缓存的时候,考虑到对象直接序列化为byte[],中间节省了转化为json字符串的一步,能提高一点效率,最开始考虑的就是Java内置序列化方案,那么下面直接上代码,一个序列化工具类
public class JavaSerializerUtil {
public static <T> byte[] serialize(T obj) {
byte[] bytes = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream sOut;
try {
sOut = new ObjectOutputStream(out);
sOut.writeObject(obj);
sOut.flush();
sOut.close();
bytes = out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return bytes;
}
public static <T> T deserialize(byte[] bytes) {
if (bytes == null) {
return null;
}
T t = null;
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
ObjectInputStream sIn;
try {
sIn = new ObjectInputStream(in);
t = (T) sIn.readObject();
sIn.close();
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
- Java Object Serialize,java原生方法不依赖外部类库,序列化后byte[]字节数比较大,不能跨语言
- 对象需要实现实现Serializable,序列化接口的对象并不强制声明唯一的serialVersionUID,是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响,其实就是在添加或修改对象属性的时候,反序列化会报错。
- 序列化后会存储对象的很多信息,导致效率慢,内容多。
还有一个重要的,如果是使用jdk1.8 ,使用OffsetDateTime,LocalDateTime等类型的属性,原生序列化天然支持,如果使用jackson、hessian等,可能需要自己实现序列化器,比较麻烦。