序列化和反序列化
概述
对象的序列化流——ObjectOutputStream
public class Person implements Serializable { //不implements的话会异常
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class ObjOpstr {
public static void main(String[] args) throws IOException {
ObjectOutputStream objos = new ObjectOutputStream(new FileOutputStream("H:\\test\\aa.txt"));
Person per = new Person("小新",6);
objos.writeObject(per);
objos.close();
}
}
对象的反序列化流——ObjectInputStream
public class ObjInput {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objips = new ObjectInputStream(new FileInputStream("H:\\test\\aa.txt"));
Object o = objips.readObject();
objips.close();
System.out.println(o);
}
}
transient关键字——瞬态关键字
private transient String name;
private int age;
InvaidClassException原理以及解决方法
private static final long serialVersionUID = 1L; //Person类的ID不改变
private transient String name;
private int age;
这样的话反序列就不会以上出现的异常了。
练习:序列化集合
public class NewPractice {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ArrayList<Person> arr = new ArrayList<>();
arr.add(new Person("小新",6));
arr.add(new Person("妮妮",7));
arr.add(new Person("风间",8));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("H:\\test\\dd.txt"));
oos.writeObject(arr);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("H:\\test\\dd.txt"));
Object o = ois.readObject();
ArrayList<Person> arrPer = (ArrayList<Person>)o;
for (Person person : arrPer) {
System.out.println(person);
}
}
}
ps:序列化再反序列化,看最终结果是否不变