对象流是一对高级流,在流链接中的作用是完成对象的序列化与反序列化
序列化:是对象输出流的工作,将对象按照其结构转化为一组字节的过程
反序列化:是对象输入流的工作,将一组字节还原为对象的过程
java.io.ObjectInputStream常用构造器
ObjectInputStream(InputStream in):创建一个对象输入流并连接到参数in这个输入流上
常用方法
Object readObject():进行对象反序列化,将读取的字节转化为一个对象并以Object形式返回(多态),如果读取的字节表示的不是一个java对象,会抛出java.io.ClassNotFoundException
public class OISDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Person person = (Person)ois.readObject();
System.out.println(person);
ois.close();
}
}
java.io.ObjectOutputStream
常用构造器
ObjectOutputStream(OutputStream out):创建一个对象输出流并连接到参数out这个输入流上
常用方法
void writeObjecat(Object obj):进行对象序列化
public class OOSDemo {
public static void main(String[] args) throws IOException {
String name = "xxx";
int age = 18;
String gender = "女";
String[] otherInfo = {"身高168", "演员"};
Person p = new Person(name, age, gender, otherInfo);
FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
System.out.println("写出完毕");
oos.close();
}
}
注意:序列化的对象必须是实现可序列化接口:java.io.Serializable;如果没有实现,就会抛出异常:java.io.NotSerializableException
java.io.Serializable可序列化窗口没有任何抽象方法
该类中所有的引用类型属性也需要是实现该接口,但是String,包装类,数组都已经实现可序列化接口
实现序列化接口的类中建议显示定义常量:static final long serialVersionUID = 1L;
原因:如果先进行对象的序列化,再对对象的类进行修改,则原本类中默认的serialVersionUID发生了变化,即读取到的对象的序列化版本号与当前类的序列化版本号不一致,再对对象进行反序列化时,会抛出异常:java.io.InvalidClassException
对类中的属性添加关键字transient,被修饰的属性在序列化时,会被忽略,即输出内容为null,0,等系统默认值,从而对象序列化达到瘦身的目的



