零基础java自学流程-Java语言高级515

本文详细介绍了Java中对象的序列化与反序列化过程,包括如何使用`Serializable`接口实现对象持久化,通过`ObjectOutputStream`写对象到文件,以及`ObjectInputStream`从文件读取对象。示例代码展示了如何处理读取对象时可能出现的异常,并给出了使用集合类存储序列化对象的解决方案。此外,还强调了序列化接口的作用和序列版本号的重要性,以及静态数据和`transient`关键字在序列化中的特殊处理。

例:对象读写:

1 import java.io.Serializable;
 2 //学生类
 3 public class Student implements Serializable{
 4     private static final long serialVersionUID = -8942780382144699003L;
 5     String name;
 6     int age;
 7     public Student(String name,int age){
 8         this.name=name;
 9         this.age=age;
10     }
11     @Override
12     public String toString() {
13         return "Student [name=" + name + ", age=" + age + "]";
14     }    
15 }

Student
1 import java.io.EOFException;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8 
 9 /**
10  * 使用对象输出流写对象和对象输入流读对象
11  *注意:如果Student没有序列化,会抛出java.io.NotSerializableException
12  *Serializable:序列号,是一个标识接口,只起标识作用,没有方法
13  *当一个类的对象需要IO流进行读写的时候,这个类必须实现接口
14  */
15 public class ObjectOperate {
16     public static void main(String[] args) throws IOException, ClassNotFoundException {
17         writeObject();
18         //创建对象输入流的对象
19         ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
20         //读取对象
21         try {
22             while(true){
23                 Object obj=ois.readObject();
24                 System.out.println(obj);
25             }
26         }catch(EOFException e){
27             System.out.println("读到了文件末尾");
28         }
29         
30         //释放资源
31         ois.close();
32         
33     }
34 
35     public static void writeObject() throws FileNotFoundException, IOException {
36         //创建对象输出流的对象
37         FileOutputStream fos=new FileOutputStream("a.txt");
38         ObjectOutputStream oos=new ObjectOutputStream(fos);
39         //创建学生对象
40         Student s1=new Student("张三",20);
41         Student s2=new Student("李四",30);
42         Student s3=new Student("王五",10);    
43         //写出学生对象
44         oos.writeObject(s1);
45         oos.writeObject(s2);
46         oos.writeObject(s3);
47         //释放资源
48     }
49 }

ObjectOperate
1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.util.ArrayList;
 8 /**
 9  * 使用对象输出流写对象和对象输入流读对象
10  *解决读取对象出现异常的问题,使用集合类
11  */
12 public class ObjectOperate2 {
13     public static void main(String[] args) throws IOException, ClassNotFoundException {
14         listMethod();
15         //创建对象输入流对象
16         ObjectInputStream ois=new ObjectInputStream(new FileInputStream("b.txt"));
17         //读取数据
18         Object obj=ois.readObject();
19         //System.out.println(obj);
20         //向下转型
21         ArrayList<Student> list=(ArrayList<Student>) obj;
22         for(Student s:list) {
23             System.out.println(s);
24         }
25         //释放资源
26         ois.close();
27     }
28 
29     public static void listMethod() throws IOException, FileNotFoundException {
30         //创建对象输出流的对象
31         ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("b.txt"));
32         //创建集合类
33         ArrayList<Student> list=new ArrayList<Student>();
34         //添加学生对象
35         list.add(new Student("zhangsan",20));
36         list.add(new Student("lisi",30));
37         //写出集合对象
38         oos.writeObject(list);
39         //释放资源
40         oos.close();
41     }
42 
43 }

ObjectOperate2

序列化接口Serializable的作用:没有方法,不需要覆写,是一个标记接口为了启动一个序列化功能。唯一的作用就是给每一个需要序列化的类都分配一个序列版本号,这个版本号和类相关联。在序列化时,会将这个序列号也一同保存在文件中,在反序列化时会读取这个序列号和本类的序列号进行匹配,如果不匹配会抛出java.io.InvalidClassException.

注意:静态数据不会被序列化,因为静态数据在方法区,不在对象里。

或者使用transient关键字修饰,也不会序列化。


尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值