序列化和反序列化
序列化:指将一个对象给定一个唯一的编号,让其他人也可以通过序列号使用它。
反序列化:将序列化的对象再重新转换为对象。
创建一个User类
/**
* 创建一个User类并实现Serializable接口
* 使该类序列化
*/
public class User implements Serializable {
private Integer userId;
private String account;
private String key;
private char sex;
private Integer age;
//生成无参构造方法
public User() {
}
//生成有参构造方法
public User(Integer userId, String account, String key, char sex, Integer age) {
this.userId = userId;
this.account = account;
this.key = key;
this.sex = sex;
this.age = age;
}
//重写toString方法
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", account='" + account + '\'' +
", key='" + key + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
}
之后创建一个User对象,并把它写到文件当中。
private static String temp = "f:"+File.separator+"io"+File.separator+"temp.txt";
static void writerUser(){
User user = new User(1,"admin1","123",'男',100);
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(temp));
//把对象序列化到文件中
oos.writeObject(user);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
打开写入的文件
可以还是可以看出一些user对象的痕迹的
之后再用方法读取
static void exp2(){
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(temp));
User user = (User) ois.readObject();
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
控制台中可以看出
已完整输出了刚刚写入的对象。
再假设不用序列化,不要让User类实现Serializable接口,再调用上面两个方法
则会得到:
NotSerializableException 【未序列化异常】
因为没有序列化,所以无法根据读取到文件生成新的对象。
总结:
创建一个实例不仅仅可以使用new 这个对象,还可以使用反序列化来创建。