版权声明:ssupdding https://blog.csdn.net/sspudding/article/details/88828655
一、序列化与反序列化
1、基本概念
将对象转化为字节的过程称之为序列化
将字节转化为对象的过程称之为反序列化
transient:序列化中使用的关键字
作用是控制的变量不参与序列化,在变量前添加该关键字,序列化过程中该变量不会写入反序列化过程,该变量给定其初始值
在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
2、作用
- 对象存储到本地磁盘需要序列化
- 数据在网络中传输也需要序列化
3、serialVersionUID(串行化版本统一标识符)
是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
-
作用
用来表明类的不同版本间的兼容性。 -
生成方式
- 默认的(UID的默认值依赖JAVA编译器,对同一个类,不同编译器编译可能导致UID不同)
- 根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
-
显式定义UID的作用
- 确保不同版本有不同的UID
- 序列化一个类实例,更改一个字段或者添加一个字段,不设置UID,任何更改导致无法反序列化实例,并抛出异常。
如果添加UID,反序列化旧实例,新增加或者更改字段被设为初始值,对象为null
注意: 在JAVA中,只有类实现了java.io.Serializable接口,才能进行序列化
因为看到说对象的序列化和反序列化需要通过ObjectInputStream和ObjectOutputStream进行操作,所以我就再研究了一下这两流
二、对象输入输出流
对象的输入输出流主要的作用是用于写入对象信息与读取对象信息。
对象的输出流: ObjectOutputStream
对象的输入流: ObjectInputStream
对象的输出流将指定的对象写入到文件的过程,就是将对象序列化的过程。
对象的输入流将指定序列化好的文件读出来的过程,就是对象反序列化的过程。
使用示例
先将Person类序列化,所以要实现Serializable接口
class Person implements Serializable {
private int age;
private String name;
private boolean sex;
public Person(String name,int age,boolean sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", sex=" + sex +
'}';
}
}
public class ObjectDemo {
////将对象的信息写到硬盘上---->对象的序列化
public static void write(String path) throws IOException {
FileOutputStream fileOutput = new FileOutputStream(path);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutput);
Person person = new Person("张三",18,"男");
objectOutputStream.writeObject(person); //将对象写入文件
objectOutputStream.close();
}
//把文件中的对象信息读取出来---->对象的反序列化
public static void read(String path) throws IOException, ClassNotFoundException {
FileInputStream fileInputStream = new FileInputStream(path);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Person person = (Person)objectInputStream.readObject();
System.out.println(person);
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "C:\\Users\\lo\\Desktop\\ss.txt";
write(path);
read(path);
}
}