Serializable接口 序列化 反序列化

本文介绍了Java中的Serializable接口,探讨了序列化和反序列化的过程。实现Serializable接口使得对象能够被序列化,serialVersionUID用于验证序列化前后的一致性。静态和transient修饰的字段不会被序列化。序列化可以用于高效地存储和传输对象状态,而反序列化则用于从字节序列恢复对象。

源码:啥也没有

public interface Serializable {
}

Serializable是啥

  • 一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。
  • 可以看到下面的例子。我们创建一个Student类,然后实例对象。把他序列化。结果报错。因为没有实现Serializable接口。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 如果我们将学生类,实现Serializable接口,就不会报错了。并生成了txt文件,存储了对象的字节序列。
    在这里插入图片描述
  • 再进行反序列化。
    在这里插入图片描述
    在这里插入图片描述
    为什么呢,为什么实现了Serializable接口就可以序列化了呢?跟到底层源码。可以看到可以被序列化的可以是:字符串,数组,枚举,和实现了Serializable接口。
    在这里插入图片描述
    在这里插入图片描述
  • serialVersionUID的用处。我们先序列化,然后给学生类,增加一个成员变量。再反序列化。我们发现报错了。显示serialVersionUID不匹配云云。
    在这里插入图片描述
    得到两个信息:1:serialVersionUID是序列化前后的唯一标识符。2:如果没有人为指定,编译器自动声明。
  • serialVersionUID是序列化和反序列化的暗号。反序列化时,JVM把字节流中的序列号ID和被序列化类中的序列化ID进行对比,一致时才能被反序列化。否则报错。
  • 如果不显示设定serialVersionUID,生成默认的。如果更改了类的结构或者信息,serialVersionUID也会跟着改变。所以最好是 认为设定serialVersionUID。
    使用IntelliJ IDEA自动生成serialVersionUID
    在这里插入图片描述
    在这里插入图片描述
  • 凡是被static修饰的字段是不会被序列化的
  • 凡是被transient修饰的字段也是不会被序列化的(这个字段存放隐私值,如密码等)
  • 下面的例子可以看到password字段被transient修饰,没有被序列化。

在这里插入图片描述
在这里插入图片描述

什么是序列化与反序列化?

  • 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

  • 把对象转换为字节序列的过程称为对象的序列化

  • 把字节序列恢复为对象的过程称为对象的反序列化

Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

那为什么还要继承Serializable。那是存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。

公众号:CodeSheep
https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值