序列化流和反序列化流 ObjectInputStream和ObjectOutputStream
概述
Java是面向对象语言,万事万物皆对象,如果我们想要将对象持久化写入到本地或者在网络中传输,我们可以使用序列化流和反序列化流
特点
字节流读写文件的功能
能够读写引用数据类型,即读写对象
需要写入到文件的对象需要该对象的类实现Serializable,否则会抛出异常
如果不希望对象的某个成员写入到文件,保障成员的安全性,可以使用transient关键字修饰。
serialVersionUID用作Serializable类中的版本控件。如果您没有显式声明serialVersionUID,JVM将根据您的Serializable类的各个方面自动为您执行此操作。
自定义声明序列id语句 :
private static final long serialVersionUID
在需要序列化的类名后实现implements Serializable,在类体里声明serialVersionUID。当反序列化时再次在反序列化类体声明,两者数字需要相同,不然会出现异常java.io.InvalidClassException。
当你不声明 serialVersionUID时,系统会根据你需要序列化的类对象自动生成一个 serialVersionUID保存,再将对象写入文件中。当你反序列化的时侯,再次根据文件的对象生成的 serialVersionUID,与写入时的 serialVersionUID对比,如更改过对象信息,不进行反序列化。
序列化后生成的Class文件(类名,方法命等)没有发生变化(增加空格,换行,增加注释等等),就算再编译多次,serialVersionUID也不会变化的。
public class Person implements Serializable {
private static final long serialVersionUID=4359709211352400087L;
public int id;
transient public String name;
transient public final String userName;
public int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.userName="aaaaa";
this.age=age;
}
}
public class SerialTest {
//private static final long serialVersionUID=4359709211352400087L; //不需要写serialVersionUID
public static void main(String[] args) {
Person p=new Person(1124,"张三",18);
System.out.println(p);
try {
FileOutputStream fos=new FileOutputStream("xxx\\person.txt");
final ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.useProtocolVersion(98765);
oos.flush();
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class DeserialTest {
private static final long serialVersionUID=4359709211352400087L;
public static void main(String[] args) {
Person p;
try {
FileInputStream fis=new FileInputStream("xxx\\person.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
p = (Person)ois.readObject();
ois.close();
System.out.println(p.userName);
System.out.println(p.id);
System.out.println(p.name);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}