先看看它们在io体系中的位置:
---------------------------------------------------------------------------------
序列化流:
可以将java中的对象写到本地文件中,
如这样的数据写到文件后变成这样----->
目的就是防止别人看得懂,修改本地文件
方法:
步骤:
1.书写标准javabean并实现Serializable接口,创建javabean对象
- 不实现接口输出会报错
- 这个接口内无抽象方法,为标记型接口,一旦实现这个接口,那么就表示当前javabean可被序列化
2.创建序列化流对象
- 注意参数填字节流,并关联目的文件
3.writeObject写入对象
4.关流
实例:
Student:
public class Student implements Serializable {
private String name;
private int age;
public Student() {
}
public Student( String name, int age) {
this.name = name;
this.age = age;
}
//set、get、toString...
}
//创建学生对象
Student stu=new Student("zhangsan",23);
//创建序列化对象
//注意参数:放入字节流对象
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("..\\ioDemo\\student.txt"));
//写出学生对象
oos.writeObject(stu);
//关流
oos.close();
写出后:
反序列化:
可以把序列化到本地文件中的对象,读取到程序中来
方法:
步骤:
1.创建反序列化对象
- 注意参数填字节流,并关联要反序列的文件
//创建反序列流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("..\\ioDemo\\student.txt"));
//读取
Object o = ois.readObject();
System.out.println(o);
//如要使用Student对象内的方法,要强转成Student类型
//关流
ois.close();
Student{name = zhangsan, age = 23}
一些细节:
当序列化对象后 改变了文件数据或改变了javabean的成员变量,会使反序列化报错。
如在这里增删数据:
或在这增删变量
只说在改变了javabean的成员变量,会使反序列化报错。这是为什么?
在创建javabean时java会根据成员方法、成员变量、静态变量、构造方法来生成一个序列号
当写入文件后,文件记录的序列号就固定了,若此时对javabean内容进行了修改,就会产生一个新的序列号,
这时进行反序列化,文件记录的序列号和javabean的序列号 对不上,所以报错。
解决:
可以在javabean中将序列号定为常量,就算改变了内容,序列号也不会再改变了
如图:
首先设置这两个选项
这时就会提示未定义序列号
这样就定下来了
瞬态关键字:
该类的所有字段都必须是可序列化的。如果一个字段不需要序列化,则需要使用transient 关键字进行修饰。
如: