对象流(序列化与反序列化)
1、放入硬盘、文件或数据库称为序列化,反之称为反序列化
2、Serialization、Deserialization
3、不是所有的对象都可以序列化:需要实现接口serializable(相当于一个通行证告诉虚拟机此对象需要序列化)
4、先写出后读取、读写顺序一致
5、在数据流的内置方法基础上添加了writeObject()
6、如果写入自己的JavaBean对象则需要将JavaBean实现serializable接口
7、即使写入的对象有的不想使用也得全部都读出来
如果JavaBean中的某个属性不需要序列化则在JavaBean中定义为 private transient String name
代码示例
public static void main(String[] args) throws IOException, ClassNotFoundException {
//写入---序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos));
oos.writeUTF("iloeyoy");
oos.writeInt(89);
oos.writeBoolean(false);
oos.writeObject(new Date()); //writeObject()内部实现了serializable接口
byte[] datas = baos.toByteArray();
//读取--反序列化
ObjectInputStream dis = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(datas)));
String msg = dis.readUTF();
int age = dis.readInt();
boolean b = dis.readBoolean();
Date date = (Date)dis.readObject();
}
对象流的文件操作
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("obj.txt")));
oos.writeUTF("iloeyoy");
oos.writeInt(89);
oos.writeBoolean(false);
oos.writeObject(new Date()); //writeObject()内部实现了serializable接口
oos.flush();
oos.close();
//读取
ObjectInputStream dis = new ObjectInputStream(new BufferedInputStream(new FileInputStream("obj.txt")));
String msg = dis.readUTF();
int age = dis.readInt();
boolean b = dis.readBoolean();
Date date = (Date)dis.readObject();
System.out.println(date);