1.系列化和反序列化
把对象以流的方式写入到文件中保存,叫写对象,即对象的序列化。
将文件中的对对象以流的方式读取到内存中,叫做对象的读取,即对象的反序列化。
2.序列化流 ObjectOutputStream
注意:该流的构造方法的参数是字节流
注意:写出的方法是writeobject();
这就是为什么有些接口中没有任何方法,因为该接口时标记性接口,会标记某个类属于某一个类型,常见的有Cloneable和Serilizable.
3.反序列化流ObjectInputStream
注意:ois.readObject();会抛出一个ClassNotFoundException,必须存在该对象所对应的的类
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("G:\\aa\\bb\\cc\\11.txt"));
Object o = ois.readObject();
ois.close();
System.out.println(o);
Person person=(Person) o;
System.out.println(person.getName()+" "+person.getAge());
}
4.transient瞬态关键字
如:private /static/ transient int age;这样的话age就不能被序列化。
为防止由于类中某些变量发生变化而导致反序列化时出现错误invalideClassException,可以自己生成序列号。
5.练习:
序列化集合
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectOutputStream osw=new ObjectOutputStream(new FileOutputStream("G:\\aa\\bb\\cc\\11.txt"));
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("G:\\aa\\bb\\cc\\11.txt"));
Person p1=new Person("张三",19);
Person p2=new Person("李四",18);
Person p3=new Person("王五",17);
List<Person> list=new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
osw.writeObject(list);
osw.close();
Object o = ois.readObject();
List<Person> list1=(ArrayList<Person>)o;
for (Person person : list1) {
System.out.println(person.getName()+" "+person.getAge());
}