您的位置:首页 > 编程语言 > Java开发

Java序列化(Serialize)和反序列化(Deserialize)

2016-07-04 00:08 501 查看
对象的序列化

一、目的:

将对象转换成与平台无关的二进制流,从而可以保存到磁盘或者进行网络传输,其它程序获 得这个二进制流后可以将其还原成对象。

序列化机制可以使对象可以脱离程序的运行而对立存在。

————————————————————————————————————————

二、是什么?

序列化(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就可以直接输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java io流