学习要点
- 定义
- IO如何序列化
序列化
- 序列化:是将对象的状态存储到特定存储介质中的过程。
- 反序列化:从特定存储介质中的数据重新构建对象的过程。
- 实现了java.io.Serializable接口的类才能进行序列化操作。
IO序列化
1 序列化相关类
类
ObjectOutputStream
常用构造方法
public ObjectOutputStream(OutputStream out) //使用FileOutputStream
常用方法
void writeObject(Object obj)
2 反序列化相关类
类
ObjectInputStream
常用构造方法
public ObjectInputStream(InputStream in) //使用FileInputStream
常用方法
void readObject()
3 示例代码
/**学生类*/
package com.etc.seri;
import java.io.Serializable;
public class Student implements Serializable {//实现序列化接口
private String name;
private int age;
private String gender;
private transient String password;// 密码通常不进行序列化
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
/**测试类*/
package com.etc.seri;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args) {
Student student=new Student("张三", 21, "男", "123321");
File file =new File("F:\\MyJava\\chapter17\\src\\com\\etc\\seri\\db.ini");
//saveObj(student, file);
Student zs = getObj(file);
System.out.println(zs.getName()+zs.getPassword());
}
/** 序列化 */
public static void saveObj(Student student, File file) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(student);
System.out.println("序列化成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/** 反序列化 */
public static Student getObj(File file) {
ObjectInputStream ois = null;
Student student=null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
student=(Student)ois.readObject();//读出学生对象数据
System.out.println("读取学生信息成功!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return student;
}
}
上机练习
需求说明
- 网上购物时某用户填写订单,订单内容为:用户名、商品编号、商品名称、单价、数量
- 商品列表,保存在“Order.bin”中。
- 运行时,如果不存在“Order.bin”,则进行新订单录入,如果存在,则显示并计算客户所需付款。
- 编写Init()方法提供从控制台输入购买信息
- 编写Save()方法保存对象到“Order.bin”
- 编写Load()方法获得对象,计算客户所需付款
分析
提示
可以使用集合保存对象,然后将集合中所有的对象进行序列化。
如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取。
参考代码