- 1.基本介绍
- 2.ObjectOutputStream序列化
- 1.ObjectOutputStream_.java
- 2.Master.java
- 3.Dog.java
- 3.ObjectInputStream反序列化
2.ObjectOutputStream序列化 1.ObjectOutputStream_.java
- 功能,提供了对基本类型或对象类型的序列化和反序列化的方法。
- ObjectOutputStream提供序列化功能。
- ObjectInputStream提供反序列化功能。
- //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
package com.outputstream; import java.io.*; 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(9.5);// double -> Double (实现了 Serializable) oos.writeUTF("Demo龙龙咯嘛");//String //保存一个dog对象 oos.writeObject(new Dog("旺财", 10, "日本", "白色")); oos.close(); System.out.println("数据保存完毕(序列化形式)"); } }2.Master.java
package com.outputstream; import java.io.Serializable; public class Master implements Serializable { }3.Dog.java
- //序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
- //序列化对象时,要求里面属性的类型也需要实现序列化接口
- //serialVersionUID 序列化的版本号,可以提高兼容性
package com.outputstream; import java.io.Serializable; public class Dog implements Serializable { private String name; private int age; //序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员 private static String nation; private transient String color; //序列化对象时,要求里面属性的类型也需要实现序列化接口 private Master master = new Master(); //serialVersionUID 序列化的版本号,可以提高兼容性 private static final long serialVersionUID = 1L; public Dog(String name, int age, String nation, String color) { this.name = name; this.age = age; this.color = color; this.nation = nation; } @Override public String toString() { return "Dog{" + "name='" + name + ''' + ", age=" + age + ", color='" + color + ''' + '}' + nation + " " +master; } 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; } }
3.ObjectInputStream反序列化演示结果
- 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致,否则会出现异常。
- 如果我们希望调用Dog的方法, 需要向下转型.。
- dog 的编译类型是 Object , dog 的运行类型是 Dog.。
- 需要我们将Dog类的定义,放在到可以引用的位置。
package com.inputstream; import com.outputstream.Dog; import java.io.*; public class ObjectInputStream_ { public static void main(String[] args) throws Exception { //指定反序列化的文件 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 , dog 的运行类型是 Dog Object dog = ois.readObject(); System.out.println("运行类型=" + dog.getClass()); System.out.println("dog信息=" + dog);//底层 Object -> Dog //1. 如果我们希望调用Dog的方法, 需要向下转型 //2. 需要我们将Dog类的定义,放在到可以引用的位置 Dog dog2 = (Dog)dog; System.out.println(dog2.getName()); //旺财.. //关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流 ois.close(); } }
演示结果