首先说明Serializable主要作用将类的实例持久化保存,序列化就是保存,反序列化就是读取。保存也不一定保存在本地,也可以保存到远方。类一定要实现Serializable才可以
实例
操作的学生类
import java.io.Serializable;
public class Student implements Serializable {
private int id;
private String name;
private String sex;
// 自定义serialVersionUID
private static final long serialVersionUID = 8735132092273200831L;
// 加上 transient 关键字后Serializable就不会再本地存储该类型
transient private String school;
public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
用于测试的实例
import java.io.*;
public class Serializable {
public static void main(String[] args){
// writeObj();
readObj();
}
/**
* 将类作为文本写入硬盘
*/
public static void writeObj(){
Student s=new Student(1,"测试","男");
try{
ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream("obj.txt"));
objectOutputStream.writeObject(s);
objectOutputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 将类从文本中提取并赋值给内存中的类
*/
public static void readObj(){
try{
ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream("obj.txt"));
try{
Object object=objectInputStream.readObject();
Student student=(Student)object;
System.out.println(student);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
测试方法
- 先在main方法中运行writeObj将实例化的学生类写入本地
- 将writeObj方法注释
- 添加readObj方法
- 运行后无异常
- 在Student类增加一个属性
- 运行main函数,出错
- 在新增属性前加入 transient 关键字
- 运行main函数 无错
- 自定义自己的UID
- 运行main函数出错
- 根据错误将错误中的uid复制进入自己定义的uid
- 运行无错