目录
1对象流
可以操作对象的类,是一个对象在文件中的读取或者写入。
2序列化和反序列化
2.1序列化ObjectOutputStream
将对象实例保存到磁盘的过程
2.1.1声明形式
public class ObjectOutputStream
extends OutputStream implements ObjectOutput, ObjectStreamConstants;
2.1.2构造函数
public ObjectOutputStream(OutputStream out) throws IOException;//需要传入一个字节输出流
2.1.3特有方法
public final void writeObject(Object obj) throws IOException ;
//写入一个对象
2.2反序列化ObjectInputStream
将对象从磁盘中读取出来的过程
2.2.1声明形式
public class ObjectInputStream
extends InputStream implements ObjectInput, ObjectStreamConstants
2.2.2构造函数
public ObjectInputStream(InputStream in) throws IOException;//需要传入一个字节输入流
2.2.3特有方法
public final Object readObject()
throws IOException, ClassNotFoundException;//写入一个对象
2.3特点
(1)对象要能完成序列化和反序列化的对象必须实现Serializable接口
(2)序列化和反序列化需要使用到IO类ObjectInputStream和ObjectOutputStream
(3)虚拟机是否能支持序列化,也需要取决于serialVersionUID值
(4)transient关键字是来控制变量的序列化,在变量前加关键,当前的变量不参与序列化,反序列化中 transient关键字修饰的变量会给定初始值,存储对象时这个变量的值将不会改变。
private transient int age;
如:int类型存储变量值为0,对象类型存储null值
2.3序列化和反序列化过程
2.3.1Person类
import java.io.Serializable;
public class Person implements Serializable { //实现Serializable 接口
private String name;
private transient int age;
private int id;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "{姓名:"+getName()+" 年龄:"+getAge()+" 学号:"+getId()+"}";
}
}
2.3.2序列化过程
//主方法里
Person person = new Person(); //先new一个对象
person.setName("张三");
person.setAge(20);
person.setId(1906);
ObjectOutputStream outputStream = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\ccc\\Desktop\\IO流\\b.txt");
outputStream = new ObjectOutputStream(fileOutputStream);
outputStream.writeObject(person); //写入person对象
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (outputStream != null) {
try {
outputStream.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3.3反序列化过程
//主方法里
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new
FileInputStream("C:\\Users\\ccc\\Desktop\\IO流\\b.txt"));
Person o = (Person)inputStream.readObject(); //从文件中读取对象
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(inputStream != null){
try {
inputStream.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3.4结果
new的person对象是:张三,20,1906
但是因为private transient int age; 不管对象给定的age值是多少,存储进去的都会是0
3版本号serialVersionUID
如果将对象写入磁盘之后,想要添加或者修改变量,就会出现代码中的内容与磁盘存储内容不一致的情况,这该如何解决呢?
serialVersionUID的作用是进行版本控制,当对类添加或者修改类中的任何字段,已经序列化的对象将无法恢复,因为类已经生成新的serialVersionUID,在进行反序列化时,会将当前类的serialVersionUID和序列化的对象的serialVersionUID进行比较,如果不匹配,将抛出异常。