1.定义

这是一个接口,当一个类实现这个接口后,这个类就变成了一个可序列化的类,它就可以被写入流,保存起来,然后也可以用流读取,反序列化。

一般情况下,一个对象会随着程序的执行完成而消失,而有时我们需要保存下来一个对象的状态,这个时候就可以把它序列化。
2.具体实现:

先定义一个Person类

class Person implements Serializable{   
        private static final long serialVersionUID = 1L; //一会就说这个是做什么的
        String name;
        int age;
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }   
        public String toString(){
            return "name:"+name+"\tage:"+age;
        }
    }

测试类Test

public class Test {
        public static void main(String[] args) {
            File file = new File("D:" + File.separator + "test.txt");
     
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(file);
                ObjectOutputStream oos = null;
                try {
                    oos = new ObjectOutputStream(fos);
                    Person person = new Person("tom", 22);
                    System.out.println(person);
                    oos.writeObject(person); // 写入对象
                    oos.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        oos.close();
                    } catch (IOException e) {
                        System.out.println("oos关闭失败:" + e.getMessage());
                    }
                }
            } catch (FileNotFoundException e) {
                System.out.println("找不到文件:" + e.getMessage());
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    System.out.println("fos关闭失败:" + e.getMessage());
                }
            }
     
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                ObjectInputStream ois = null;
                try {
                    ois = new ObjectInputStream(fis);
                    try {
                        Person person = (Person) ois.readObject(); // 读出对象
                        System.out.println(person);
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        ois.close();
                    } catch (IOException e) {
                        System.out.println("ois关闭失败:" + e.getMessage());
                    }
                }
            } catch (FileNotFoundException e) {
                System.out.println("找不到文件:" + e.getMessage());
            } finally {
                try {
                    fis.close();
                } catch (IOException e) {
                    System.out.println("fis关闭失败:" + e.getMessage());
                }
            }
        }
    }

输出结果:

name:tom    age:22
name:tom    age:22

如果Person类没有实现Serializable类,程序就会报如下错

java.io.NotSerializableException: com.souter.SerializableTest.Person

我们可以看到在Person类中定义了一个serialVersionUID,这个字段可以是1L,或者随机生成一个long类型的数据。

这个字段是这个序列化的对象的唯一标识,如果想上面的例子,序列化和反序列化都在一起,那么不会影响,如果是网络传输,那就不需保证序列化和反序列化的ID保持一致,否则会反序列化失败
3.有关静态变量的序列化

如果类的一个变量是静态的,那么它不会被序列化到流中,反序列化后这个字段会为空或者0。因为本质上序列化是针对对象的序列化,而静态变量实际上是类的属性,不是对象的属性。
4.序列化的继承

如果父类实现了Serializable接口,那么子类不需要继承,自动成为可序列化;
如果子类实现了Serializable,那么父类也实现Serializable才能被序列化
————————————————
版权声明:本文为CSDN博主「南泽rolix」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yufeng1397/article/details/83512586

最新文章

  1. listview1
  2. 20145304 刘钦令 Java程序设计第二周学习总结
  3. VMware安装的相关文章
  4. java 读取Excel文件并数据持久化方法Demo
  5. 【UVA 11997 K Smallest Sums】优先级队列
  6. Awesome Delphi
  7. CUDA学习ing..
  8. 对SNS网站现状和未来的一些想法——以我对人人网的体验为例
  9. sping 框架学习之——初始篇
  10. windows 下进程池的操作
  11. delphi 10.1 Berlin 中使用自带的 Base64 编码
  12. 2.抽取代码(BaseActivity)
  13. Web.xml中Filter过滤器标签几个说明
  14. DEV Winform分页用户组件
  15. Ik分词器没有使用---------elasticsearch-analysis-ik 5.6.3分词问题
  16. atitit.加入win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux
  17. django 模型对象的 update() get_or_create() 的使用
  18. [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]
  19. django允许外部访问
  20. Laravel SMS 短信发送包

热门文章

  1. input type=range 进度条的自定义样式
  2. 「CF859E」Desk Disorder
  3. 13 DFT变换的性质
  4. Spark性能调优-基础篇
  5. 【代码学习】PYTHON字符串的常见操作
  6. HDU3172 Virtual Friends
  7. 201771010135杨蓉庆《面向对象程序设计(java)》第二周学习总结
  8. 如何判断WLC的FUS版本
  9. lc 0222
  10. pytorch资料