序列化流和反序列化流

95 阅读3分钟

序列化流和反序列化流

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.如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢? 解决方案:给该成员变量添加关键字,该关键字标记的成员变量不参与序列化过程