例:对象读写:
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关键字修饰,也不会序列化。

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

被折叠的 条评论
为什么被折叠?



