序列化流和反序列化流
1.序列化流
序列化流通常我们是用来对一些较为重要的数据进行一个加密,不让它被随意改变,可以把java中的对象写到本地文件中。
通常我们是要创建一个新的对象,因为序列化流又有另一个名称是对象操作输入流,顾名思义了
public static void main(String[] args) throws IOException {
//可以把java中的对象写到本地文件中
//1.创建对象
Student stu = new Student("zhangsan",20);
//2.创建序列化流的对象/对象操作输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\、\\Desktop\\a.txt"));
//3.写出数据
oos.writeObject(stu);
//4.释放资源
oos.close();
}
这些算是主要的步骤,创建的对象,要进行一系列的JavaBean,然后借用这个序列化流,将java 的对象写到本地文件中。
2.反序列化流
也是顾名思义了,就是将序列化流过的数据进行一个反向操作,让它原本的数据出来
public static void main(String[] args) throws IOException, ClassNotFoundException {
//反序列化流,又叫对象操作输入流
//用反序列化流将序列化的本地文件读取到程序中
//1.创建反序列化流的对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\、\\Desktop\\a.txt"));
//2.读取数据
Object o = ois.readObject();
//3.打印对象
System.out.println(o);
//4.释放资源
ois.close();
}
使用反序列化流可以将数据读取到程序当中,也就是说我们可以在控制台看到文件中原本的内容是什么
细节
细节1
如果我们已经创建了对象,并使对象实现Serializable接口,那么我们不能随意更改对象中的属性,因为原本的对象通过序列化流已经产生了一个序列号,假如修改了,我们再使用反序列化流进行读取,则会报错,因为我们要读取的序列号与被保存的序列号不相同,没办法读取。
解决方法:我们可以在创建对象的时候直接给他固定版本号,定义规范:
private static final long serialVersionUID = ;
把buff都叠满了,就是不让它被修改。
细节2
有一些成员变量的值我不想序列化到本地文件,就是对一些成员变量进行保密,我们要在所需要的成员变量前面加上transient:瞬态关键字:作用:不会把当前属性序列化到本地文件当中,这样在我们添加数据并进行反序列化出来之后,我们将无法看到被transient修饰的成员变量的值
总结
1.我们在使用序列化流将对象写到文件时,需要让JavaBean类实现Serializable接口,否则,会出现NotSerializableException异常
2.序列化流写到文件中的数据是不能修改的,一旦修改了就无法再次读回来了
3.序列化对象后,修改了JavaBean类,再次反序列化,会不会有问题? 会出现问题,会抛出InvalidClassException异常 解决方案:给JavaBean类添加serialVersionUID(序列号,版本号)
4.如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢? 解决方案:给该成员变量添加关键字,该关键字标记的成员变量不参与序列化过程