序列流和反序列流

先看看它们在io体系中的位置:
序列流和反序列流_第1张图片
---------------------------------------------------------------------------------

序列化流:

可以将java中的对象写到本地文件中,
如这样的数据写到文件后变成这样----->
序列流和反序列流_第2张图片序列流和反序列流_第3张图片
目的就是防止别人看得懂,修改本地文件

方法:
序列流和反序列流_第4张图片
步骤:
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();

写出后:
image.png

反序列化:

可以把序列化到本地文件中的对象,读取到程序中来
方法:
序列流和反序列流_第5张图片
步骤:
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的成员变量,会使反序列化报错。
如在这里增删数据:
image.png
或在这增删变量
序列流和反序列流_第6张图片
只说在改变了javabean的成员变量,会使反序列化报错。这是为什么?

在创建javabean时java会根据成员方法、成员变量、静态变量、构造方法来生成一个序列号
image.png
当写入文件后,文件记录的序列号就固定了,若此时对javabean内容进行了修改,就会产生一个新的序列号,
这时进行反序列化,文件记录的序列号和javabean的序列号 对不上,所以报错。
解决:
可以在javabean中将序列号定为常量,就算改变了内容,序列号也不会再改变了
如图:
首先设置这两个选项
序列流和反序列流_第7张图片
这时就会提示未定义序列号
序列流和反序列流_第8张图片
这样就定下来了
序列流和反序列流_第9张图片

瞬态关键字:
该类的所有字段都必须是可序列化的。如果一个字段不需要序列化,则需要使用transient 关键字进行修饰。
如:序列流和反序列流_第10张图片

你可能感兴趣的:(java)