序列化和反序列化是编程处理对象数据的重要概念,特别是在数据存储、网络通信和分布式系统中。
序列化是指将程序中的对象(如数据结构、类实例等)的状态信息转换为可以存储或传输的格式的过程。这个过程会将对象的公共和私有字段(包括对象的属性、方法等)转化为一个字节流(或其他格式,如字符串),使得这个对象可以被写入磁盘文件、通过网络发送,或者以其他方式存储。序列化的目的在于保留对象的状态,以便是未来某个时刻可以恢复这个对象到完全相同的状态。
反序列化则是序列化过程的逆操作,它将序列化的数据格式转换为原来对象的过程。通过读取并解析序列化的数据,系统能够重建对象实例,并恢复其在序列化时的状态。
序列化和反序列化应用:
- 持久化存储:将对象状态保存到磁盘,用于长期存储或稍后恢复。
- 网络通信:在分布式系统或客户端-服务器模型中,对象需要通过网络发送给另一方,序列化使得对象能够以字节流的形式在网络上进行高效、无损的传输。
- 进程间通信:在同一个系统内的不同进程之间交换对象时,也需要序列化和反序列化。
- 缓存:将对象序列化后存储在内存或外部缓存系统中,以提高数据访问速度。
目录
1、创建一个可序列化的类
2、序列化对象到文件
3、反序列化对象
在Java中,序列化和反序列化通过实现Serializable接口完成,下面是一个简单示例:
1、创建一个可序列化的类
在pojo包下定义一个简单的User实体类,并实现Serializable接口。这个接口是一个标记接口,标志着一个类的对象是可以被序列化的。
public class User implements Serializable {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "User{name = " + name + ", age = " + age + "}";
}
}
2、序列化对象到文件
编写一个方法来序列化User对象
public class SerializableTest {
// 序列化是指将程序中的对象的状态信息转换为可以存储或传输的格式的过程
public static void main(String[] args) {
User user = new User("shang", 21);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("d:/user.ser"));
oos.writeObject(user);
System.out.println("序列化对象到文件");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这段代码创建 了一个User对象,并使用ObjectOutputStream将其序列化到名为"user.ser"的文件中。
3、反序列化对象
编写一个方法来从文件中反序列化这个对象
public class DeserializationTest {
public static void main(String[] args) {
try {
//从磁盘读取文件
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/user.ser"));
User user = (User) ois.readObject();
System.out.println("user = " + user);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}