序列化流:能把java的对象写到本地文件中
构造方法
public class test {
public static void main(String[] args) throws IOException {
student s=new student("邓子",19);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa\\objectStream.txt"));
oos.writeObject(s);
}
}
class student implements Serializable{
String name;
int age;
public student(String name, int age) {
this.name = name;
this.age = age;
}
}
将一个student对象写到文件中,javabean类需要实现Serializable接口,它是一个标记性接口,内部没有方法,实现了这个接口就表示对象能被序列化。
反序列化流:能将本地文件中的对象数据读取
构造方法
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa\\objectStream.txt"));
Object o =ois.readObject();
System.out.println(o);
}
接收到的类型是object类型,不要忘记强转哦
细节:
1.我们修改了javabean内容时再用反序列化流读取内容,会报错
原因:
当对象实现了Serializable接口接口,java会根据类中所有内容计算出一个long类型的版本号,当修改javabaan中的内容产生变化,版本号也会随之变化,跟文件中的版本号不一样
解决方法:自己定义版本号
当然可以让系统帮忙生成一个
File->Settings->搜索Serializable->将下图两个选项勾上
接着点击类名按alt+回车就可以添加啦
2.当我们不想把某个属性序列化到本地文件,可以在变量前面加上关键字 transient关键字。
class student implements Serializable {
private static final long serialVersionUID = -1874880573502256851L;
String name;
int age;
transient String address;
}
3.序列化流写到文件中的内容是不能修改的,修改就无法读取了
4.当我们读取到文件末尾时,代码会产生一个异常
表示文件读到了末尾,为了避免这个异常,我们常常把多个对象放入集合中进行序列化,这样读取一次就可以获得集合中全部对象
student d=new student("邓子",19,"聪明");
student x=new student("诩子",18,"笨猪");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("D:\\aaa\\objectStream.txt"));
ArrayList<student> s=new ArrayList<>();
s.add(d);
s.add(x);
oos.writeObject(s);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D:\\aaa\\objectStream.txt"));
ArrayList<student> o = (ArrayList<student>) ois.readObject();
for (student student1 : o) {
System.out.println(student1);
}