(JAVA)-IO流-序列化流

本文详细介绍了如何使用Java的序列化流将对象写入文件,包括实现Serializable接口的重要性、版本控制策略以及如何避免文件末尾异常。还提到如何使用transient关键字控制属性序列化,以及利用集合处理文件末尾异常的技巧。
摘要由CSDN通过智能技术生成

序列化流:能把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);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值