什么是序列化和反序列化
序列化:是将对象转换为可传输或存储的过程,
反序列化:通常是将字节流或是其他数据格式或源数据转为对象的过程。
序列化的作用
- 对象的持久化:将对象的状态保存到磁盘或数据库中,以便在程序重新启动时恢复对象。
- 对象的传输:通过网络或其他通信方式将对象发送到远程系统,实现分布式系统的通信。
- 对象的缓存:将对象序列化后存储在缓存中,可以提高读取和响应速度。
总结来说序列化后可以传输,持久化保存到文件或系统缓存中进行交互。
java序列化转成字节流的好处
跨平台兼容以及方便传输和持久化存储: 字节流是一种通用的数据表示方式,可以在不同平台客户端,服务器之间传输或磁盘上或在数据库中存储
占用空间小和隐私安全: 字节流更紧凑,并且不直接暴露对象的内部结构和属性,占用更少的存储空间。
总结将对象序列化为字节流跨平台兼容以及方便传输,紧凑占用空间小和隐私更安全。
java中序列化的实现
类实现 Serializable 接口,
Serializable 接口没有任何方法,只是一个标记接口是一个约定和规范,是为了表明一个类可以被序列化会把对象转换为字节流,具体序列化过程就是通过流将对象写入流 在读出来
import java.io.Serializable;
public class MyClass implements Serializable {
// 类的成员变量和方法
}
类实现 Externalizable 接口
需要实现 writeExternal 和 readExternal 方法,以提供更高度的自定义序列化和反序列化过程
import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;
public class MyExternalizableClass implements Externalizable {
@Override
public void writeExternal(ObjectOutput out) {
// 自定义序列化逻辑
}
@Override
public void readExternal(ObjectInput in) {
// 自定义反序列化逻辑
}
}
将对象转为JSON格式或是解析JSON数据转为对象
// 通过jdk的ObjectMapper将对象转为json
AllPerson person = new AllPerson();
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);
// 还可以通过alibaba的fastjson或是hutoll的json工具
关于序列化注意的问题
定义serialVersionUID有什么用
serialVersionUID是一个用于版本控制的静态变量,用于确保在对象序列化和反序列化过程中,类的版本一致性
transient修饰成员变量不被序列化
如果在一个序列化的类中一些成员变量不需要或不能被序列化可以使用关键字transient修饰
NotSerializableException
如果一个类没有实现Serializable接口 但是在用流将类序列化时就会报错
关于JSON序列化的理解
将对象解析成JSon格式就是序列化的过程,将JSON数据解析为对象就是反序列化的过程,因为JSON也是一种通用的跨平台的格式
演示了如何将一个实现了 Serializable 接口的对象序列化成字节流,并在反序列化时还原对象
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// 创建一个实现了 Serializable 接口的对象
MyClass myObject = new MyClass("Hello, Serialization!");
// 将对象序列化为字节流
try (FileOutputStream fileOut = new FileOutputStream("myobject.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(myObject);
} catch (IOException e) {
e.printStackTrace();
}
// 从字节流中反序列化对象
try (FileInputStream fileIn = new FileInputStream("myobject.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
MyClass restoredObject = (MyClass) in.readObject();
System.out.println(restoredObject.getMessage()); // 输出: Hello, Serialization!
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class MyClass implements Serializable {
private String message;
public MyClass(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}