对象的序列化
一、目的:
将对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获 得这个二进制流后可以将其还原成对象。
序列化机制可以使对象可以脱离程序的运行而对立存在。
————————————————————————————————————————
二、是什么?
序列化(Serialize)指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该java对象。
————————————————————————————————————————
三、如何实现对象的序列化
要实现对象的序列化,必须让它的类实现序列化,可以通过实现Serializable接口。
特别:1) Serializable接口中并没有需要实现的方法,它的作用仅仅是一个标记,表示实现 它的类是可序列化的。诸如像Serializable这种没有方法的接口,我们一般称之为 标记接口。
2)一定要添加序列化版本号(serialVersionUID)
3)一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?
使用transient关键字声明不需要序列化的成员变量
————————————————————————————————————————
四、将对象写入文件
1)创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt"));
2)创建可序列化类的对象
Student s = new Student("张三",15);
3) 将对象写入文件
oos.writeObject(s);
4)关闭资源
oos.close();
应该注意的问题:
* ObjectOutputStream 的构造方法,需要借助一个字节输出流,并可能存在IOException。
public ObjectOutputStream(OutputStream out)throws IOException
* 在执行oos.writeObject(s)时,可能抛出以下异常:
** InvalidClassException
可能的原因:
<*>该类的序列版本号与从流中读取的类描述符的版本号不匹配
<*>该类包含未知数据类型
<*>该类没有可访问的无参数构造方法
** NotSerializableException 类未实现Serializable接口
** IOException
———————————————————————————————————————
五、文件中读取数据,并转换对象
// 创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.txt"));
// 还原对象
Object obj = ois.readObject();
// 释放资源
ois.close();
// 输出对象
System.out.println(obj);
应该注意的问题:
* 在执行ois.readObject();的时候可能抛出IOException, ClassNotFoundException
* 得到的obj不需要强转为Student就可以直接输出。