Java 序列化和反序列化

一直对 Java 中的序列化和反序列化有疑惑:序列化和反序列化有什么用?怎么进行对象的序列化和反序列化?被序列化的类代码中的 serialVersionUID 有什么用?下面的这篇来自CodeSheep的文章很好地回答了这些问题。

我来做一个小小的总结:

序列化和反序列化有什么用
序列化可以把一个对象转换成字节序列,然后存储在磁盘中。反序列化顾名思义就是序列化的一个逆过程,即将一个字节序列还原成一个对象。那么为什么要把一个对象以字节序列的格式存储在磁盘中呢?那是因为,首先,我们可以永久地存储一个对象的信息;其次,字节序列可以用于其他方面的传输,例如网络运输(这个还有点不大懂)。

怎么使用
代码略过~
IO流的知识是必不可少的,毕竟涉及到文件的读写操作。其中需要的类主要是:File,ObjectInputStream,ObjectOutputStream,FileInputStream,FileOutputStream.
其中,被序列化的对象的类必须实现 Serializable 接口(这是一个标记借口)。然后将这个对象传入ObjectOutputStream 的 writeObject 方法中(ObjectOutputStream 对象的构造略过~)。这样一来,这个对象就存储在磁盘中了。反序列化则需要创建一个 ObjectInputStream (同样略过构造),然后调用 readObject 方法。

SerialVersionUID 有什么用
首先考虑一下下面的场景:当一个对象被序列化且存储在磁盘中后,如果此时这个类的代码被更改,那么很好想象会有这么一个结果,那就是这个字节序列无法被还原成一个对象,而且会有错误信息告诉我们,版本不一样。
有两个事实:

  1. serialVersionUID 是序列化前后唯一的标识符
  2. 如果没有显式地定义一个 serialVersionUID,那编译器就会为它自动声名一个。

在反序列化时,如果字节序列中的 serialVersionUID 和被序列化的类的 serialVersionUID 不同,就无法被反序列化,这也就是之前描述的情况。
如果类中的代码发生了改变,那么这个类的 serialVersionUID 也会发生改变。所以,为了 serialVersionUID 的确定性,最好显式地定义一个值。

这篇文章中还有很多关于 SerialVersionUID 的技术细节,包括静态常量和transient关键字,单例模式使用实现序列化不能保证单例的问题,序列化的受控和加强。文章语言通俗易懂,值得一读。

如果我的总结有错误,请大家指出。

文章网址在这里👇
https://b23.tv/IcHB4y

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值