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应用中,用户会话信息可以通过序列化保存到服务器,以便跨请求或会话保持用户状态。
  • 数据持久化:将对象状态保存到数据库或文件系统中,实现数据的长期存储。