什么是序列化
在软件中, 一个项目的对象数据存放在内存中, 要经过一个过程的转换, 这个转换就是序列化和反序列化. 所以序列化就是将对象转换为数据, 反序列化就是将数据转换为对象.
JDK序列化有哪些问题
-
Java自带序列化只能被Java反序列化
不同编程语言间就无法使用 -
Java序列化有安全问题
使用Java序列化的代码
Java官网的安全编码指导方针中有说明: “对不信任数据的反序列化, 从本质上来说就是危险的, 应该予以避免。”, 说明Java序列化是不安全的
//使用Java序列化只需要在类继承Serializable
public class Demo implements Serializable {
private String value;
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
ObjectOutputStream out;
{
try {
out = new ObjectOutputStream(os);
out.writeObject(new Demo("one"));
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- Java序列化执行速度低于JSON序列化
注: Java序列化与NIO ByteBuffer序列化本质上没有巨大差别
替代方案
首先是JSON序列化.
- Spring Boot内置Jackson的JSON序列化
- Dubbo内置的hessian(改)序列化方案
- Goole的Protocol Buffers序列化