一、概述
序列化
把对象转换为字节序列的过程称为对象的序列化。//需求:将张三的这个对象存储到D:下的文件中 Student stu = new Student(); stu.setSid(1); stu.setName("张三"); //备份文件以及存储对象全部都是以.bak结尾格式 File file = new File("D:\\a.bak"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); //调用oos中的写入的方法 oos.writeObject(stu); System.out.println("OK"); //关闭资源 oos.close(); fos.close();
注意事项 如果通过序列化流保存一个对象 这个对象的额实体类必须实现序列化接口
目的:让对象是处于唯一的。 定义一个id
反序列化
把字节序列恢复为对象的过程称为对象的反序列化。//反序列化 将文本文件中存储的对象读取处理 ObjectInputStream File file = new File("D:\\a.bak"); FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Student stu = (Student)ois.readObject(); System.out.println(stu.getSid()+" "+stu.getName()); ois.close(); fis.close();
二、 serialVersionUID的作用
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量
private static final long serialVersionUIDpublic class Student implements Serializable{ /** * 将光标移入Student类中,ctrl+1 回车 * 序列接口的唯一ID 让Studnet在这个项目中处于一个唯一性 */ private static final long serialVersionUID = 1L; private int sid; private String name; public Student() { // TODO Auto-generated constructor stub } public Student(int sid, String name) { super(); this.sid = sid; this.name = name; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
三、 主要用途
(1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
(2)在网络上传送对象的字节序列。
四、 JDK类库中的序列化API
(1)序列化
① java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
② 对象序列化包括如下步骤
2.1 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2.2 通过对象输出流的writeObject()方法写对象。
(2)反序列化
① java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
② 对象反序列化的步骤
2.1 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2.2 通过对象输入流的readObject()方法读取对象。//为什么集合添加到文本文件中,不需要实现序列化接口。 //因为集合本身已经实现了 //保存多个 使用集合的方式进行存储 List<Student> list = new ArrayList<Student>(); for (int i = 1; i <= 100; i++) { list.add(new Student(i+1, "张三"+i)); } File file = new File("D:\\诺糯米.bak"); FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(list); oos.close(); bos.close(); fos.close(); File file = new File("D:\\诺糯米.bak"); FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); ObjectInputStream ois = new ObjectInputStream(bis); List<Student> list = (List<Student>)ois.readObject(); for (Student student : list) { System.out.println(student.getSid()+" "+student.getName()); } ois.close(); bis.close(); fis.close();