Object处理流:能够将基本数据类型或者对象进行序列化和反序列化操作
序列化与反序列化:
1.序列化就是在保存数据时,保存数据的值和数据类型
2.反序列化就是在恢复数据时,恢复数据的值和数据类型
注意事项和细节说明
1.序列化读写顺序要求一致
2.要求实现序列化或反序列化,需要实现Serializable(标识接口,推荐选择该接口)或Externalizable(一般不选用该接口)
3.序列化的类中建议添加serialVersionUID以提高版本的兼容性
4.序列化对象时,默认将类内部所有属性都序列化,故要求属性的类型都实现了序列化接口。但static和transient修饰的属性不进行序列化
5.序列化具备可继承性,若父类为可序列化类,其子类也可序列化
注:标识接口即没有任何方法和属性的接口,不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
ObjectOutputStream
@Test
public void write() throws IOException {
//文件后缀名不重要 序列化的有自己的保存方式(非纯文本)
String filePath = "E:\\data.dat";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
objectOutputStream.writeInt(100);//int在底层会自动装箱成Integer Integer实现了Serializable接口
objectOutputStream.writeBoolean(true);//boolean -> Boolean
objectOutputStream.writeByte(1);//byte -> Byte
objectOutputStream.writeChar('A');//char -> Character
objectOutputStream.writeUTF("hello");//String实现了Serializable接口
//......
//保存一个people对象
objectOutputStream.writeObject(new People("jay",20));
objectOutputStream.close();
}
ObjectInputStream
@Test
public void read() throws IOException, ClassNotFoundException {
String filePath = "E:\\data.dat";
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));
//反序列化的顺序需要和序列化的顺序一致 否则会出现异常
System.out.println(objectInputStream.readInt());
System.out.println(objectInputStream.readBoolean());
System.out.println(objectInputStream.readByte());
System.out.println(objectInputStream.readChar());
System.out.println(objectInputStream.readUTF());
//people的编译类型是Object 运行类型是People
Object people01 = objectInputStream.readObject();
System.out.println("运行类型 = "+ people01.getClass());
System.out.println(people01.toString());
//如果想调用people的函数 需要向下转型
People people02 = (People)people01;
System.out.println(people02.getName() +" "+ people02.getAge());
objectInputStream.close();
}
People(建议设置成公共类,因为二者都需要访问)
public class People implements Serializable {
private String name;
private int age;
//serialVersionUID为序列化的版本唯一号 可以提高兼容性
//存在版本号的时候 对类进行修改 系统只会认为类进行了版本修改 而不会认为这是一个新的类
private static final long serialVersionUID = 1;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", 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;
}
}