Object流 | 对象流 | 引用数据类型流 : 保留数据类型(基本|引用)字节流的功能流序列化 : 将对象转为可存储|可传输的状态的过程序列化输出流 ObjectOutputStream新增功能 : void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
反序列化输入流 ObjectInputStream新增 功能 : Object readObject() 从ObjectInputStream中读取一个对象。先序列化后反序列化
不是所有的类型的对象都能实现序列化 java.io.Serializable
不是所有的属性都需要序列化 transient
静态属性不会序列化
如果父类实现了序列化,子类没有实现,子类可以序列化所有内容
如果父类没有实现序列化,子类实现了序列化,子类只能序列化独有内容序列号 :实现了序列化的类型都默认存在序列号,如果显示定义以定义的为主,没有显示的定义,会存在默认的如果使用的是默认提供的序列号,会跟随成员的改动而更新通过序列号控制前后版本一致问题 : 默认在读取对象时候会先检查序列号,如果不一致直接抛出异常java.io.InvalidClassException,一致才能正常转换
如果想要实现就算类型的成员修改,序列号也要保持不变-->手动添加序列号
需要进行步骤 :1.实现Serializable接口2.在settings进行设置3.选中序列号类型类名->alt+enter->生成序列号字段
public class Class004_Object{public static void main(String[] args) throws Exception {writeToFile("D://xixi.txt");readFile("D://xixi.txt");}public static void writeToFile(String path) throws IOException {//1.构建流ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));//2.准备数据Student s = new Student(101,"李四",18);int[] arr = {1,2,3,4,5};//3.写出os.writeObject(s);os.writeObject(arr);//4.刷出os.flush();//5.关闭os.close();Student.no = 100;}public static void readFile(String path) throws Exception {//1.构建流ObjectInputStream is = new ObjectInputStream(new FileInputStream(path));//2.读取Student s = (Student) is.readObject();int[] arr = (int[]) is.readObject();//3.使用System.out.println(s);System.out.println(Arrays.toString(arr));//4.关闭is .close();}
}class Student implements Serializable {private static final long serialVersionUID = 7292531504929399778L;static int no;private String name;private transient int age;public Student() {}public Student(int no, String name, int age) {this.no = no;this.name = name;this.age = age;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}