文章目录
- 1.定义
- 2.目的
- 3.使用
- 1)序列化
- 2)反序列化
- 3.应用场景
- 4.注意事项
- 总结
1.定义
序列化(Serialization)是将对象的状态转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输
说简单点,序列化就是把一个对象转变为二进制的数据流
那么,与 序列化
相对于的还有 反序列化
反序列化是什么呢?它就是 序列化
的一个反向过程
2.目的
序列化的主要目的有两个 持久化
和 通信
- 持久化: 将对象的状态保存到磁盘或者数据库中,以便在程序重启时能够恢复对象的状态
- 通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递
3.使用
Java 提供了一个强大的序列化框架,使得开发者能够轻松地将对象序列化和反序列化。要实现序列化,类必须实现 java.io.Serializable
接口,这是一个标记接口,没有任何方法需要实现。
使用时,实现这个接口即可
import java.io.Serializable;
class Stu implements Serializable {
private String name;
private int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "[name :" + name + ",age :" + age + "]";
}
}
Java 使用 ObjectOutputStream
和 ObjectInputStream
类来实现序列化和反序列化。
1)序列化
将 Stu 对象的信息 序列化 到 stuFile 文件中,以便保存
示例代码:
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Demo {
public static void main(String[] args) throws Exception{
Stu stu = new Stu("cheney", 18);
ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("stuFile")));
oos.writeObject(stu);
System.out.println("学生类被序列化啦! 内容是 :" + stu );
}
}
class Stu implements Serializable {
private String name;
private int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "[name :" + name + ",age :" + age + "]";
}
}
输出结果:
学生类被序列化啦! 内容是 :[name :cheney,age :18]
并生成了我们所指定的文件 stuFile
2)反序列化
将 stuFile 文件 中的 Stu 对象的信息 序列化 到内存中,以便再次使用
示例代码:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Demo {
public static void main(String[] args) throws Exception{
ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("stuFile")));
Stu stu = (Stu) ois.readObject();
System.out.println("学生类被序列化啦! 内容是 :" + stu );
}
}
class Stu implements Serializable {
private String name;
private int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "[name :" + name + ",age :" + age + "]";
}
}
输出结果:
学生类被序列化啦! 内容是 :[name :cheney,age :18]
3.应用场景
- 对象持久化: 将对象的状态保存到文件系统,以便在程序重新启动时能够恢复对象的状态
- 网络通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递
- 缓存: 将对象序列化后存储在缓存中,以减少对象的重复创建和初始化成本
- 消息传递: 在消息传递系统中,通过序列化可以方便地将消息对象传递给其他系统或服务
4.注意事项
-
版本兼容性: 序列化后的数据是与类的结构相关的,因此在进行序列化后,如果类的结构发生变化,反序列化可能会失败。为了解决这个问题,可以使用
serialVersionUID
静态变量来指定一个版本号private static final long serialVersionUID = 1L;
-
敏感信息: 序列化的对象中可能包含敏感信息,如密码等。在实际应用中,应该谨慎考虑对象中是否包含敏感信息,如果有,应该采取相应的安全措施
-
性能影响: 序列化和反序列化过程可能会对性能产生一定的影响,特别是当对象结构较为复杂时。在性能敏感的场景中,要谨慎使用序列化
-
选择合适的序列化方式: Java 提供了多种序列化方式,如默认的 Java 序列化、JSON 序列化、XML 序列化等。根据实际需求选择合适的方式
总结
序列化是一种强大的工具,为开发者提供了方便的手段来实现对象的持久化、网络通信和消息传递。通过实现 Serializable
接口,我们可以轻松地将对象序列化和反序列化。在实际应用中,要注意版本兼容性、敏感信息的处理以及选择合适的序列化方式,以确保序列化的安全和高效。