序列化和反序列化
- 把对象转换为字节序列的过程称为对象的
序列化
。----写对象的过程- 把字节序列恢复为对象的过程称为对象的
反序列化
。----读对象的过程
步骤
- 创建一个类,集成
Serializable
接口 - 创建对象
- 将对象写入文件
- 从文件读取对象信息
使用到:
- 对象输入流:ObjectInputStream
- 对象输出流:ObjectOutputStream
ObjectInputStream
构造方法
- ObjectInputStream()
为完全重新实现ObjectInputStream的子类提供一种方法,不必分配刚刚被ObjectInputStream实现使用的私有数据。
- ObjectInputStream(InputStream in)
创建从指定的InputStream读取的ObjectInputStream。
常用方法
- close()
关闭输入流。
- read()
读取一个字节的数据。
- read(byte[] buf, int off, int len)
读入一个字节数组。
- read()
读取一个字节的数据。
- read(byte[] buf, int off, int len)
读入一个字节数组。 - readBoolean()
读取布尔值。
- readByte()
读取一个8位字节。
- readChar()
读一个16位字符。
- readDouble()
读64位双倍。
- readInt()
读取一个32位int。
- readLong()
读64位长。
- readObject()
从ObjectInputStream读取一个对象。
- readShort()
读取16位短。
ObjectOutputStream
构造方法
- ObjectOutputStream()
为完全重新实现ObjectOutputStream的子类提供一种方法,不必分配刚刚被ObjectOutputStream实现使用的私有数据。
- ObjectOutputStream(OutputStream out)
创建一个写入指定的OutputStream的ObjectOutputStream。
常用方法
- close()
关闭流。
- flush()
刷新流。
- write(byte[] buf)
写入一个字节数组。
- write(byte[] buf, int off, int len)
写入一个子字节数组。
- write(int val)
写一个字节。
- writeBoolean(boolean val)
写一个布尔值。
- writeByte(int val)
写入一个8位字节。
- writeBytes(String str)
写一个字符串作为字节序列。
- writeChar(int val)
写一个16位的字符。
- writeChars(String str)
写一个字符串作为一系列的字符。
- writeDouble(double val)
写一个64位的双倍。
- writeFields()
将缓冲的字段写入流。
- writeFloat(float val)
写一个32位浮点数。
- writeInt(int val)
写一个32位int。
- writeLong(long val)
写一个64位长
- writeObject(Object obj)
将指定的对象写入ObjectOutputStream。
- writeShort(int val)
写一个16位短。
示例:
public static void main(String[] args) {
Goods goods1 = new Goods("gd0001", "电脑", 3000);
try {
FileOutputStream fos = new FileOutputStream("goodsList.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("goodsList.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
// 对象的序列化,写入对象
oos.writeObject(goods1);
oos.writeBoolean(false);
oos.flush();
// 对象的反序列化,读对象
System.out.println(ois.readObject());
// 先读Goods对象,后读Boolean,顺序不可变,否则报错
System.out.println(ois.readBoolean());
fos.close();
oos.close();
fis.close();
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}