ObjectOutputStream和ObjectInputStream类
这两个流是用来将对象写入到文件中,或者从文件中读取一个对象,都是高级流。
在这两个类的使用过程中,涉及到序列化与反序列化的问题。
序列化:将对象转化成字节数组写入到文件中的过程。
反序列化:将字节数组转换成对象读入到程序的过程。
实现序列化和反序列化的要求是:该对象对应的类,必须实现序列化的接口(实现序列化的接口不需要重写任何方法,因为该接口中没有抽象方法,但是必须实现此接口表明当前的类可以被序列化和反序列化)。
写入对象的简单实现
public class TestObjectOutputStream {
public static void main(String[] args) throws IOException {
Person p = new Person("张三",23,3000);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\keshe\\person.obj"));
oos.writeObject(p);
}
}
读出对象的简单实现
public class TestObjectInputStream {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\keshe\\person.obj"));
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
}
}
被写入和读出的类
public class Person implements Serializable{
private static final long serialVersionUID = -6764416307607687218L; //版本号
String name;
transient int age;
int salaxy;
public Person() {
super();
}
public Person(String name, int age, int salaxy) {
super();
this.name = name;
this.age = age;
this.salaxy = salaxy;
}
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 int getSalaxy() {
return salaxy;
}
public void setSalaxy(int salaxy) {
this.salaxy = salaxy;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", salaxy=" + salaxy + "]";
}
}
在这里要注意:上述程序中存在一个版本号,这个版本号需要显式指定,在读写版本号一致时才能进行正确的操作。
其中也出现了transient关键字,这个关键字表示的含义是忽略,在序列化到文件中时会忽略此被关键字修饰的属性,自然在反序列化时该属性也没有值。