基本概念
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。
Java对象的序列化与反序列化
Java对象的序列化与反序列化
在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收我们都可以复用该对象。但是,我们创建出来的这些Java对象都是存在于JVM的堆内存中的。只有JVM处于运行状态的时候,这些对象才可能存在。一旦JVM停止运行,这些对象的状态也就随之而丢失了。
但是在真实的应用场景中,我们需要将这些对象持久化下来,并且能够在需要的时候把对象重新读取出来。Java的对象序列化可以帮助我们实现该功能。
对象序列化机制(object serialization)是Java语言内建的一种对象持久化方式,通过对象序列化,可以把对象的状态保存为字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式再转换成对象。对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。
在Java中,对象的序列化与反序列化被广泛应用到RMI(远程方法调用)及网络传输中。
Serializable 接口
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。 (该接口并没有方法和字段,为什么只有实现了该接口的类的对象才能被序列化呢?)
当试图对一个对象进行序列化的时候,如果遇到不支持 Serializable 接口的对象。在此情况下,将抛出NotSerializableException。
如果要序列化的类有父类,要想同时将在父类中定义过的变量持久化下来,那么父类也应该集成java.io.Serializable接口。
如下图:
import java.io.Serializable;
/**
* User类
*
* @author
* 实现Serializable接口
*/
public class User implements Serializable {
private static final long serialVersionUID = -6855639960555789910L;
private String userId;
private String userName;
private int age;
public User() {
}
public User(String userId, String userName, int age) {
this.userId = userId;
this.userName = userName;
this.age = age;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", age="
+ age + "]";
}
}
序列化和反序列化对象
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;
/**
* 序列化和反序列化User类对象
*
* @author
*
*/
public class SerializeAndStudy {
public static void main(String[] args) throws Exception {
SerializeUser();// 序列化Person对象
User user = DeserializeUser();// 反序列Perons对象
System.out.println(MessageFormat.format("userId={0},userName={1},age={2}",
user.getUserId(), user.getUserName(), user.getAge()));
}
/**
* MethodName: SerializePerson Description: 序列化User对象
*/
private static void SerializeUser() throws FileNotFoundException,
IOException {
User user = new User();
user.setUserId("1");
user.setUserName("张三");
user.setAge(22);
// ObjectOutputStream
// 对象输出流,将User对象存储到E盘的User.txt文件中,完成对Person对象的序列化操作
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
new File("D:/User.txt")));
oo.writeObject(user);
System.out.println("User对象序列化成功!");
oo.close();
}
/**
* MethodName: DeserializePerson Description: 反序列Perons对象
*/
@SuppressWarnings("unused")
private static User DeserializeUser() throws Exception, IOException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
new File("D:/User.txt")));
User user = (User) ois.readObject();
System.out.println("User对象反序列化成功!");
return user;
}
}