序列化:把Java对象转换为字节序列的过程。 ——写对象过程
反序列化∶把字节序列恢复为Java对象的过程。——读对象过程
对象序列化
- 步骤︰
- 创建一个类,继承序列化Serializable接口
- 创建对象
- 将对象写入文件
- 从文件读取对象信息
对象输入流ObjectInputStream
对象输出流ObjectOutputStream
创建一个Goods类,实现Serializable接口:
import java.io.Serializable;
public class Goods implements Serializable {
private String id; //商品编号
private String name; //商品名称
private double price; //商品价格
//构造方法
public Goods(String id, String name, double price){
this.id = id;
this.name = name;
this.price = price;
}
//getter和setter方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString(){
return "商品编号:" + id + ", 商品名称:" + name + ", 商品价格:" + price;
}
}
创建study.txt空文件,使用对象输出流将对象写入文件:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class GoodsTest {
public static void main(String[] args) {
Goods goods1 = new Goods("gd001", "电脑", 6000);
try {
FileOutputStream fos = new FileOutputStream("java_stream\\study.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将Goods对象信息写入文件
oos.writeObject(goods1);
oos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
可以看到,写入的信息是乱码。
现将写入的对象信息读取并输出看看:
public static void main(String[] args) {
Goods goods1 = new Goods("gd001", "电脑", 6000);
try {
FileOutputStream fos = new FileOutputStream("java_stream\\study.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("java_stream\\study.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//将Goods对象信息写入文件
oos.writeObject(goods1);
oos.flush();
try {
Goods goods = (Goods)ois.readObject();
System.out.println(goods);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fos.close();
oos.close();
fis.close();
ois.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出:
商品编号:gd001, 商品名称:电脑, 商品价格:6000.0
可以看到,虽然写入文件的内容乱码,但是是可以正常读取的。
对象流也可以读写布尔类型的数据,但是必须遵循先写对象就得先读对象或者先写布尔类型就先读布尔类型的规则:
public static void main(String[] args) {
Goods goods1 = new Goods("gd001", "电脑", 6000);
try {
FileOutputStream fos = new FileOutputStream("java_stream\\study.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("java_stream\\study.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
//将Goods对象信息写入文件
oos.writeObject(goods1);
oos.writeBoolean(true);
oos.flush();
try {
Goods goods = (Goods)ois.readObject();
System.out.println(goods);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ois.readBoolean());
fos.close();
oos.close();
fis.close();
ois.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出:
商品编号:gd001, 商品名称:电脑, 商品价格:6000.0
true