Java小白入门到实战应用教程-序列化
前言
在Java开发中,我们通过序列化(Serialization)对象的状态信息转换为可以存储或传输的形式,然后可以保存到文件、通过网络发送等。当需要再使用这些对象时,可以通过反序列化(Deserialization)过程恢复对象。
正文
在Java中,序列化是通过实现java.io.Serializable
接口完成的,该接口是一个标记接口(没有方法需要实现),知识用于告知JVM该类的对象可以被序列化。
样例
下面我们还是直接看样例:
创建实体类,然后实现Serializable接口,声明该对象需要进行序列化
public class User implements Serializable {
private static final long serialVersionUID = 1L; // 推荐显式声明
private String name;
private int age;
// 构造方法、getter和setter省略
}
然后我们通过该序列化的类去演示对象的序列化保存,和反序列化。
public class SerializationDemo {
public static void main(String[] args) {
User user = new User("Alice", 30);
// 序列化
try (FileOutputStream fileOut = new FileOutputStream("user.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(user);
System.out.println("Serialized data is saved in user.ser");
} catch (Exception i) {
i.printStackTrace();
}
// 反序列化
User user2 = null;
try (FileInputStream fileIn = new FileInputStream("user.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
user2 = (User) in.readObject();
System.out.println("Deserialized User...");
System.out.println("Name: " + user2.getName());
System.out.println("Age: " + user2.getAge());
} catch (Exception i) {
i.printStackTrace();
}
}
}
解释:在该列子中,我们创建了前面定义的序列化类的对象,然后通过IO流操作将对象的信息序列化后保存到文件中了。
然后在反序列化操作中,我们先通过IO流操作去读取刚才输出的文件里面的内容,然后可以将读出的内容直接反序列化成对象,并能读取对象的信息。
通过这个例子我们简单演示了对象的序列化和反序列化操作。
对象经过序列化后可以进行保存,也可以用于网络数据传输。
注意
- serialVersionUID:建议显式声明
serialVersionUID
,它用于验证序列化的对象与当前类版本是否兼容。如果不声明,JVM会根据类的详细信息自动生成一个,这可能导致版本不兼容问题。 - 非静态成员变量:只有非静态成员变量会被序列化。
- transient关键字:使用
transient
关键字修饰的变量不会被序列化。 - 安全性:序列化的数据可以被读取和修改,因此不应包含敏感信息。
- 性能:序列化操作相对较慢,且生成的序列化数据通常比原始数据大,因此应谨慎使用。
重点关注transient关键字,有的时候我们有需要类中的某个属性不需要进行序列化,这时就可以用transient关键字去修饰一下。
应用场景
- 远程对象传输:在RMI(远程方法调用)或Web服务中,对象需要在客户端和服务器之间传输。
- 会话管理:在Web应用中,用户会话信息可以通过序列化保存到服务器,以便跨请求或会话保持用户状态。
- 数据持久化:将对象状态保存到数据库或文件系统中,实现数据的长期存储。