对象序列化流
- 概述:
就是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象的数据和对象中存储的属性等信息。字节序列写到文件之后,相当于文件中持久保存了一个对象信息,反之,该字节序列还可以从文件中读取出来,重构对象,对他进行反序列化
- 要实现序列化和反序列化就要使用对象序列流和对象反序列流
①对象序列流:ObjectOutputStream
②对象反序列流:ObjectInputStream
ObjectOutputStream对象序列流
构造方法 |
说明 |
ObjectOutputStream(OutputStream out) |
创建一个写入指定的OutputStream的ObjectOutputStream |
方法 |
说明 |
writeObject(Object obj |
将指定对象写入ObjectOutputStream |
-
注意:
①一个对象要是想要被序列化,该对象所属的类必须实现Serializable接口
②Serialzable是一个标记接口,实现该接口,不需要重写任何方法
ObjectInputStream对象反序列化流
构造方法 |
说明 |
ObjectInputStream(InputStream in) |
创建从指定的InputStream读取的ObjectInputStream |
方法 |
说明 |
Object readObject() |
从ObjectInputStream读取一个对象 |
//对象序列化
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("test\\Student.txt"));
Student student =new Student("zzt",18);
objectOutputStream.writeObject(student);
//反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test\\Student.txt"));
Object o = objectInputStream.readObject();
Student student1 = (Student)o;
System.out.println(student1);
出现的问题及解决方法
- 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题?
- 会出问题,抛出InvalidClassException异常
- 如果出问题了,如何解决
- 给对象所属的类加一个serialVersionUID
prvate static final long serialVersionUID = 42L;
- 如果一个对象中的某个成员变量的值不想被序列化,如何实现呢?
- 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。