对象序列化ObjectInputStream、ObjectOutputStream
(被操作的对象需要实现Serializable(标记接口))
【1】当将数据封装成对象时,对象会随着程序的结束,就会被清空
【2】如果将堆内存的对象序列化存储在硬盘上,那么对象的数据也会存储在硬盘上,即便程序结束了该数据依然存在(对象的持久化存储)
ObjectOutputStream 序列化
ObjectInputStream反序列化
public class ObjectStreamDame {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
writeobj();
reaadobj();
}
public static void writeobj() throws FileNotFoundException, IOException {
//注意一般输出的文件格式 不使用txt,容易被打开,可以使用.object
ObjectOutputStream oos=
new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(new Person("list",19));
oos.close();
}
public static void reaadobj() throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream ois=
new ObjectInputStream(new FileInputStream("obj.txt"));
//读取序列化对象数据需要强转
Person p=(Person)ois.readObject();
System.out.println(p);
ois.close();
}
}
//实现Serializable给类标记为可序列化
class Person implements Serializable{
//【1】serialVersionUID序列号是根据类中的成员具备的数字标识算出来
//【2】序列化对象存储后java会自动生成序列号,当读取对象数据也是根据序列号读取
//【3】一但对象的成员有任何的更就会生成java会自动生成新的序列号,就无法读取
//【4】最好是自定义serialVersionUID的序列号,保证唯一性
//【5】注意静态的成员(在方法区内)不能被序列化,只能序列化堆内存的数据
//【6】用transient修饰非静态成员,那么该成员就不能被序列化
public static final long serialVersionUID = 42L;
private String name;
private int age;
transient int count;
Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString() {
return name+"::"+age;
}
}