1. 什么是序列化 和 反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。将内存中的对象按照指定的格式输出到输出设备上。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
2. 什么时候需要序列化
- 把内存中的对象状态保存到一个文件中 或者 一个数据库 中。
- 用套接字在网络上传送对象的时候。
3. 如何实现序列化
package sin_2020_03_01.Serialize;
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
serializePerson();
Person person = deserializePerson();
System.out.println(person);
}
// 反序列化
private static Person deserializePerson() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\test\\IO流\\person.txt"));
Person person = (Person)ois.readObject();
System.out.println("person 反序列化成功");
return person;
}
// 序列化
private static void serializePerson() throws IOException {
Person person = new Person();
person.setName("xixi");
person.setAge(18);
person.setSex("女");
person.setStuId(100);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\test\\IO流\\person.txt"));
oos.writeObject(person);
System.out.println("person 对象序列化成功");
oos.close();
}
}
class Person implements Serializable {
private String name;
private int age;
private String sex;
// transient 修饰的变量不能被序列化
transient private int stuId;
// static 修饰的变量,不能被序列化
private static int count = 99;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", stuId=" + stuId +
", count=" + count+
'}';
}
}

| 序列化/反序列化 | 序列化 | 反序列化 |
|---|---|---|
| 流的方向 | 输出 | 输入 |
| 选择的流 | ObjectOutputStream | ObjectInputStream |
| 构造方法 | ObjectOutputStream(new FileInputStream(File file)) | ObjectInputStream(new FileInputStream(File file)) |
| 调用的方法 | oos.writeObject(oerson) | (Person)ois.readObject() |
4. 关于静态数据是否被序列化的测试
在上述例子中,其他代码不变,进行 1)将类中静态变量count 的值设置为 777,2)主函数的调用改为如下形式:
public static void main(String[] args) throws IOException, ClassNotFoundException {
//serializePerson();
Person person = deserializePerson();
System.out.println(person);
}
运行结果为
来源:CSDN
作者:聪明伶俐王大头
链接:https://blog.csdn.net/weixin_43580746/article/details/104627955