序列化与反序列化的理解


前言

提示:仅供个人理解和学习记录


提示:以下是本篇文章正文内容,下面案例可供参考

一、序列化和反序列化的概念

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

通俗的讲,序列化,就是为了在不同时间或不同平台的JVM之间共享实例对象
父类实现了序列化,子类自动实现序列化不需要显式出来

二、什么情况下需要序列化

  1. 将对象存储在硬盘上。
  2. 将对象通过网络传输。
  3. 通过RMI远程调用等方式传输对象的时候
  4. 解决远程接口调用JVM之间内存无法共享的问题
  5. 通过将对象序列化为字节数组,使得不能共享内存只有网络连接的系统之间能够进 行对象传递

应用场景
1. 需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是 比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时;
2. 网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通 信时;

我们大部分系统序列化实体类是为了分布式的远程调用进行网络传输

三、transient关键字

将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化

四、static关键字

静态static标志的属性,它不序列化

五、serialVersionUID

1.为什么要定义serialversionUID变量

serialVersionUID适用于java序列化机制。简单来说,JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastException。

2.必要性

实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值

3.serialVersionUID有两种显示的生成方式

一是默认的1L,比如:private static final long serialVersionUID = 1L;

二是根据包名,类名,继承关系,非私有的方法和属性,以及参数,返回值等诸多因子计算得出的,极度复杂生成的一个64位的哈希字段。基本上计算出来的这个值是唯一的。比如:private static final long serialVersionUID = xxxxL;


五、Java实现序列化和反序列化的过程

1、实现序列化的必备要求:

   只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常) 

2、JDK中序列化和反序列化的API:

  ①java.io.ObjectInputStream:对象输入流。

      该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。

 ②java.io.ObjectOutputStream:对象输出流。

      该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。

3、实现序列化和反序列化的三种实现:

①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。

         ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。 
         ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。

②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

       ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。 
       ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。

③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

       ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。 
       ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

总结

详细参考链接:
https://blog.csdn.net/YingHuaNanHai/article/details/80815415
https://blog.csdn.net/tree_ifconfig/article/details/82766587

https://blog.csdn.net/qq_41594698/article/details/94296785

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值