细节:
读写要保持一致
序列对象时,默认将里面的所有属性都进行序列化,但除了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;
- }
- }
打印结果:

注意:当内容更改时,需要重新运行输入流,输出流才能输出,否则就会报错