细节:
-
读写要保持一致
-
序列对象时,默认将里面的所有属性都进行序列化,但除了static或transient修饰的成员
-
要求序列化或反序列化对象,需要实现Serializable
-
序列化对象时,要求里面的属性也要实现序列化接口
-
序列化具备可继承性,也就是说如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。
输入流:将数据写入文件,data.dat中,使用反序列化手段,将数据打印到控制台上:
public class ObjectOutputStream_ {
public static void main(String[] args) throws IOException {
//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保持
String filePath = "E:\\data.dat";
ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据 e:\data.dat
oos.writeInt(100);// int -> Integer(实现了 Serializable)
oos.writeBoolean(true); // boolean --> Boolean(实现了 Serializable)
oos.writeChar('a'); //char --> Character (实现了 Serializable)
oos.writeDouble(5.9); //double --> Double (实现了 Serializable)
oos.writeUTF("Monian is studying Java!");//String (实现了 Serializable)
oos.writeObject(new Dog("汤米",8));
oos.close();
System.out.println("数据保存完毕(序列化)~");
}
}
反序列化手段打印到控制台上的代码如下:
public class ObjectInputStream_ {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//指定反序列化的文件
String filePath = "E:\\data.dat";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
/**
* 1.读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
* 2.否则会出现异常
*/
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
//dog 的编译类型
Object o = ois.readObject();
System.out.println("dog的运行类型="+o.getClass());
System.out.println("dog的信息="+o);
/**
* 1.如果我们希望调用 Dog方法 ,需要向下转型
* 2.需要我们交Dog类的定义 ,拷贝到可以引用的位置
* Dog dog = (Dog) o;
*/
Dog dog = (Dog) o;
System.out.println("dog.name="+dog.getName());
//关闭流,关闭外层流即可,底层会关闭FileInputStream 流
ois.close();
System.out.println("数据(反序列化)打印完毕~");
}
}
这里一定要注意;当对对象进行操作的时候一定要注意,将对象类,实现Serializable接口,并且做成公共类,这样才能保证,反序列化的对象保持一致;输出时,输出的类型顺序也要原样输出
import java.io.Serializable;
public class Dog implements Serializable {
private String name;
private int age;
@Override
public String toString() {
return "Dog{" +
"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;
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
打印结果:
注意:当内容更改时,需要重新运行输入流,输出流才能输出,否则就会报错