【java学习笔记】序列化、反序列化

时间:2023-03-08 15:07:46
【java学习笔记】序列化、反序列化

序列化 是将对象的完整信息保存起来的过程(持久化)。    序列化流:ObjectOutputStream

反序列化 是将对象进行还原的过程(反持久化)。               反序列化流:ObjectInputStream

1.序列化

①一个对象想要被序列化,这个对象对应的类必须实现Serializable。Serializable接口中没有任何的方法和属性,仅仅用于标志这个类产生的对象可以被序列化。

②被static/transient关键字修饰的属性不会被序列化

③一个类在实现Serializable接口之后会默认添加一个属性serialVersionUID(版本号),默认是用private static final long 修饰,版本号的值会根据当前类中的属性和方法自动计算。一个对象在序列化的时候会把这个版本号一起序列化出去,反序列化的时候就会比较对象中的版本号和当前类的版本号是否一致---需要手动指定版本号,防止类产生微小改动的时候已经序列化的对象反序列化不回来。

④集合和大部分映射不能被序列化。

 import java.io.Serializable;

 public class Person implements Serializable {
private static final long serialVersionUID = 1984254532934148317L; private String name;
private int age;
private char gender;
private double weight;
private transient String cloth; // transient关键字标记的成员变量不参与序列化过程
public static String classroom; 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 getCloth() {
return cloth;
} public void setCloth(String cloth) {
this.cloth = cloth;
} public char getGender() {
return gender;
} public void setGender(char gender) {
this.gender = gender;
} public double getWeight() {
return weight;
} public void setWeight(double weight) {
this.weight = weight;
}
}

Person implements Serializable

 import java.io.FileOutputStream;
import java.io.ObjectOutputStream; public class ObjectOutputStreamDemo {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setName("肉丝");
p.setAge(3);
p.setCloth("无");
// p.classroom = "604"; // 创建序列化流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\p.data"));
// 写出对象
out.writeObject(p);
// 关流
out.close();
}
}

2.反序列化

 import java.io.FileInputStream;
import java.io.ObjectInputStream; public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception {
// 创建反序列化流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\p.data"));
// 读取对象
Person p = (Person) in.readObject();
in.close();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getCloth());
// System.out.println(p.classroom);
}
}

结果:

【java学习笔记】序列化、反序列化