Java总结10 对象序列化 即:对象输出流 与 对象反序列化 即:对象输入流

一/对象序列化

在这里插入图片描述
对象序列化 即:对象输出
将某个对象以字节的方式写入到硬盘
创建格式:ObjectOutputStream 自定义对象序列化对象名 = new ObjectOutputStream(new FileOutputStream(具有对象内容的文件之路径/File对象));
列如:ObjectOutputStream objectOutputStreamObj = new ObjectOutputStream(new FileOutputStream("\ObjOutputStream.txt"));
方法应用:
1/ 格式:自定义对象序列化对象名.writeObject(要输出到硬盘的对象名);
列如:objectOutputStreamObj.writeObject(studentObj);
意义:将括号内的对象输出到以字节文件的方式输出到硬盘.

二/对象反序列化

在这里插入图片描述
对象反序列化 即:对象输入
将某个存有对象的硬盘文件读入到内存中.
注意:被读入的文件必须为对象序列化文件,也就是存有对象内容的文件,如果被读入的文件非[对象序列化文件]则会报错.
创建格式:ObjectInputStream 自定义对象反序列化对象名 = new ObjectInputStream(new FileInputStream(具有对象内容的文件之路径/File对象));
列如:ObjectInputStream objectInputStreamObj = new ObjectInputStream(new FileInputStream("\testB.txt"));
方法应用:
步骤1/ 将读取到的对象赋值给左侧的变量,变量类型为Obj,尽管你知道这个对象是什么类型,但出于保险起见还是为Object为好.
格式:Object 自定义Obj类型变量名 = 自定义对象反序列化对象名.readObject();
列如:Object readObj = objectInputStreamObj.readObject();
步骤2/ 将存有对象的Object型变量强制转换成对象的原本类型,并赋值给左侧的变量.
格式:对象的原本类型 自定义原本类型变量名 = (对象的原本类型)自定义Obj类型变量名;
列如: Student readObjOfStudent = (Student)readObj;

三/serialVersionUID(serialVersionUIDtransient)

在这里插入图片描述
意义:假如你在把隶属于该类的对象(旧版本类对象)写出后,却更改了该类的成员变量或其它内容(新版本类对象),那么再次读入该类对象的话,就会报错.
因此,为了确定输出后的类对象跟其所属的类是兼容的,所以出现了’serialVersionUID’,sseriaVersionUID可以给类中赋一个,
如果输出后的类对象的UID同目前其所属类的UID是相同的,则说明是兼容的,反之则不是兼容的.
步骤1/ 对象类必须继承Serializable标识接口,才可使用UID,所谓标识,顾名思义就是要让JAVA知道,该对象类具有UID识别的功能.
格式:类权限修饰符 class 类名 implements Serializable{}
列如:public class Student implements Serializable {}
步骤二/ 声明一个UID值,以用来识别.
格式:成员变量权限修饰符 static final long serialVersionUID = 数值L;
列如:public static final long serialVersionUID = 23L;

演示:Main主方法类

public class ObjectOfSerialize {
    public static void main(String[] args) throws Exception {

        //对象序列化 即:对象输出
        ObjectOutputStream objectOutputStreamObj = new ObjectOutputStream(new FileOutputStream("\\ObjOutputStream.txt"));
        Student studentObj = new Student("中国", 5000);
        Student studentObjTwo = new Student("美国", 300);


        objectOutputStreamObj.writeObject(studentObj);
     //   objectOutputStreamObj.writeObject(studentObjTwo);

        //对象反序列化 即:对象输入
        ObjectInputStream objectInputStreamObj = new ObjectInputStream(new FileInputStream("\\ObjOutputStream.txt"));
        Object readObj = objectInputStreamObj.readObject();
        Student readObjOfStudent = (Student)readObj;



    }
}

演示:Student学生类


import java.io.Serializable;

public class Student implements Serializable {

    public static final long serialVersionUID = 23L;
    /*
    serialVersionUID(serialVersionUIDtransient)
格式:权限修饰符 static final long serialVersionUID = 23L;
列如:public static final long serialVersionUID = 23L;
意义:假如你在把隶属于该类的对象(旧版本类对象)写出后,却更改了该类的成员变量或其它内容(新版本类对象),那么再次读入该类对象的话,就会报错.
     因此,为了确定输出后的类对象跟其所属的类是兼容的,所以出现了'serialVersionUID',sseriaVersionUID可以给类中赋一个,
     如果输出后的类对象的UID同目前其所属类的UID是相同的,则说明是兼容的,反之则不是兼容的.

     */
    private String name;
    private int age;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

四/通过让实体类实现Serializable接口默认开启序列化操作

Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。

这个介绍非常的不接地气,于是我与去看了几篇博客,有一个小姐姐的博客引起了我的注意,她是这样理解的:

序列化的过程,就是一个“freeze”的过程,它将一个对象freeze(冷冻)住,然后进行存储,等到再次需要的时候,再将这个对象de-freeze就可以立即使用。

我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。

如果有人打开过Serializable接口的源码,就会发现,这个接口其实是个空接口,那么这个序列化操作,到底是由谁去实现了呢?其实,看一下接口的注释说明就知道,当我们让实体类实现Serializable接口时,其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化。

https://www.cnblogs.com/wangenxian/p/11003221.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值