序列流和反序列流

先看看它们在io体系中的位置:
Snipaste_2024-02-09_12-50-08.png
---------------------------------------------------------------------------------

序列化流:

可以将java中的对象写到本地文件中,
如这样的数据写到文件后变成这样----->
Snipaste_2024-02-09_12-51-04.pngSnipaste_2024-02-09_12-51-12.png
目的就是防止别人看得懂,修改本地文件

方法:
Snipaste_2024-02-09_12-54-07.png
步骤:
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

反序列化:

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

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

瞬态关键字:
该类的所有字段都必须是可序列化的。如果一个字段不需要序列化,则需要使用transient 关键字进行修饰。
如:image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值