写在前面:大家好。首先为你点进这篇文章有趣的文章点赞👍!文章在撰写过程中难免有疏漏和错误,欢迎你在下方留言支出文章的不足之处;如果觉得这篇文章对你有用,也欢迎你点赞和留下你的评论。更多内容请点进👉我的博客Ming小👈阅览。
序列化机制
Java提供了一种对象序列化的机制,该知识点也是非常的重要。所谓的序列化就是把对象以流的方式写入到文件中保存,可以持久保存这个对象的信息(对象的数据、对象的类型、对象存储的数据信息)。反过来,反序列化就是从文件中读取出来,重构对象。
-
ObjectOutputStream类
java.io.ObjectOutputStream
类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。public ObjectOutputStream(OutputStream out)
: 创建一个指定OutputStream的ObjectOutputStream。 -
ObjectInputStream类
ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
public ObjectInputStream(InputStream in)
: 创建一个指定InputStream的ObjectInputStream。
序列化操作
一个对象要想序列化,必须先满足两个条件:
-
该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
-
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用 transient 关键字修饰。
补充:Serializable接口可以理解是一个通行证,有了这个证件,你才能序列化或者反序列化。
transient关键字可以理解是一个静态(Static)修饰符,静态是优先于非静态加载到内存中,被static修饰的成员变量不能被序列化的,序列化的都是对象。
在Person类中调试一下更能理解
private static int age;
// private transient int age;
oos.writeObject(new Person("mingming",18));
Object o =ois.readObject();
//Person{name="mingming",age=0}
先准备一个Person类
public class Person implements Serializable{
// private static final long serialVersionUID = 1L;
private String name;
//private static int age;
//private transient int age;
public int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
对象序列化
public class Demo01ObjectOutputStream {
public static void main(String[] args) throws IOException {
//1.创建ObjectOutputStream对象,构造方法中传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\person.txt"));
//2.使用ObjectOutputStream对象中的方法writeObject,把对象写入到文件中
oos.writeObject(new Person("mingming",18));
//3.释放资源
oos.close();
}
}
对象反序列化
public class Demo02ObjectInputStream {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建ObjectInputStream对象,构造方法中传递字节输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\person.txt"));
//2.使用ObjectInputStream对象中的方法readObject读取保存对象的文件
Object o = ois.readObject();
//3.释放资源
ois.close();
//4.使用读取出来的对象(打印)
System.out.println(o);
Person p = (Person)o;
System.out.println(p.getName()+p.getAge());
}
}
Person{name='mingming', age=18} mingming18