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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}