序列化和反序列化在Java中是一种常见的编程概念,主要涉及到对象的存储和恢复。
-
序列化(Serialization):
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中,对象写入流,从而其状态可以稍后恢复。它主要用于在网络上传输对象,或者将对象持久化到数据库,文件系统等存储媒体中。在Java中,如果一个类需要被序列化,那么该类必须实现
java.io.Serializable
接口。这个接口是一个标记接口,没有任何方法需要实现,但可以告诉Java虚拟机这个类可被序列化。 -
反序列化(Deserialization):
反序列化是相反的过程,也就是说,从流中读取字节,并将这些字节转换回原始对象的形式。注意,反序列化读取的字节流必须是由相应Java序列化API序列化的。在反序列化过程中,JVM将使用无参数构造函数创建新对象。然后,JVM将从流中读取属性并将其分配给对象。这就是反序列化。
值得注意的是,序列化和反序列化对Java的安全性有影响,因此在使用这两个过程时需要特别注意。另外,transient和static类型的变量不参与序列化过程。
下面是一个使用Java进行序列化和反序列化操作的简单例子:
首先,我们创建一个需要被序列化的类,这个类需要实现java.io.Serializable接口。
package com.xiangpingeasy.learn.demo;
import lombok.Data;
import java.io.Serializable;
@Data
public class Employee implements Serializable {
public String name;
public String mobile;
public transient int age; // transient变量在序例化过程中会被忽略
}
然后,我们来执行序列化操作:
package com.xiangpingeasy.learn.demo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializeDemo {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("张三");
employee.setMobile("13812345678");
employee.setAge(30);
try {
FileOutputStream fileOut = new FileOutputStream("employee.serial");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(employee);
out.close();
System.out.println("序例化数据已经保存在employee.serial");
}catch (IOException ioe){
ioe.printStackTrace();
}
}
}
最后,我们来执行反序列化操作:
package com.xiangpingeasy.learn.demo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) {
Employee employee = null;
try {
FileInputStream fileIn = new FileInputStream("employee.serial");
ObjectInputStream in = new ObjectInputStream(fileIn);
employee = (Employee) in.readObject();
in.close();
fileIn.close();
System.out.println("反序列化:Employee");
System.out.println("姓名:" + employee.getName()); // 姓名:张三
System.out.println("手机:" + employee.getMobile()); // 手机:13812345678
System.out.println("年龄:" + employee.getAge()); // 年龄:0
}catch (IOException ioe){
ioe.printStackTrace();
}catch (ClassNotFoundException c){
c.printStackTrace();
}
}
}
这就是一个简单的Java序列化和反序列化的例子,在上面我们也看到了成员变量age不参与序列化过程。