一、认识序列化
通俗点理解,序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程。在序列化过程中,会将对象的公有成员和私有成员包括类名转换为字节流。然后再把字节流写入数据,存储到存储介质中,这里说的存储介质通常指的是文件。
意义
使用序列化的意义在于将java对象序列化后,可以将其转换为字节序列这些字节序列可以保存在磁盘上,也可以借助网络进行传输,同时序列化后的对象保存的是二进制状态,这样实现了平台无关性,即可以将在windows操作系统中实现序列化的一个对象,传输到UNIX操作系统的机器上,再通过反序列化后得到相同对象,而无需担心数据因平台问题显示异常。
二、序列化保存对象信息
序列化机制允许将实现了序列化的java对象转换成字节序列,这个过程需要借助I/O流来实现。
在java中只有实现了java.io.Serializable接口的类的对象才能被序列化,因为Serializable表示可串行的,可序列化的,所以对象序列化又被称为串行化。
对象序列化的步骤:
1.创建一个对象输出流(ObjectOutputStream),他可以包装一个其他类型的输出流,如文件输出流(FileOutputStream)
2.通过对象输出流的writeObject()方法写对象,就是输出课序列化对象。
示例:使用序列化将对象保存到文件中
实现步骤:
1.引入相关类
2.创建学生类,实现Serializable接口
3.创建对象输出流
4.调用writeObject()方法将对象写入文件
5.关闭对象输出流
package date.test9;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializableObj {
public static void main(String[] args) throws IOException {
//创建对象输出流
ObjectOutputStream os = null;
try {
os = new ObjectOutputStream(new FileOutputStream("C:\\Users\\86177\\Desktop\\1.txt"));
Test9 t = new Test9("喀什东路", "男", 32);
//对象序列化,写入输出流
os.writeObject(t);
}catch (IOException e){
e.printStackTrace();
}finally {
if (os!=null){
os.close();
}
}
}
}
~
拓展:
当需要保存多个学生对象时,可以使用集合保存对象,然后将集合中所有对象写入文件。
关键代码:
Student s1 = new Student("胡列娜",25,"女")
Student s2 = new Student("比比东",30,"女")
ArrayList<Student> list = new ArrayList<Student>()
list.add(s1)
list.add(s2)
//对象序列化,写入输出流
os.writeObject(list)
3.反序列化获取对象信息
既然能够将对象的状态保存到存储介质(如文件)中,那么如何将这些对象状态读取出来?显然,接下来讲的反序列化将是解决问题的关键。反序列化,顾名思义就是与序列化相反,反序列化是从特定存储介质中读取数据并重新构建成对象的过程。通过反序列化,可以将存储在文件上的对象信息读取出来,然后重新构建为对象。
1.反序列化的大概步骤
1.创建一个对象输入流ObjectInputStream,他可以包装一个其他类型的输入流
2.通过对象输入流的readObject方法读取对象,该方法返回一个Object对象
示例:使用反序列化读取上一个文件中的对象
package date.test9;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ReadObjectDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建对象输入流
ObjectInputStream oss = null;
try {
oss = new ObjectInputStream
(new FileInputStream("C:\\Pratice\\jdbc\\src\\doc\\1.txt"));
//反序列化,进行强制类型转型
Test9 t1 = (Test9) oss.readObject();
//输出生成后的信息
System.out.println("姓名为:" + t1.getName());
System.out.println("性别为:" + t1.getSex());
System.out.println("年龄为:" + t1.getAge());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oss != null) {
try {
oss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
拓展:
同样的,如果是以集合的方式将两个学生对象写入到文件,则有以下办法
关键代码
//反序列化,进行强制类型转换
ArrayList<Test9> list = (ArrayList<Test9>)oss.readObject();
//输出生成后的对象信息
for(Test9 t1:list){
System.out.println("姓名为:" + t1.getName());
System.out.println("性别为:" + t1.getSex());
System.out.println("年龄为:" + t1.getAge());
}