serialVersionUID详解「建议收藏」

serialVersionUID详解「建议收藏」本人学习笔记,仅供自己查阅

大家好,又见面了,我是你们的朋友全栈君。

本人学习笔记,仅供自己查阅

 


 Java类中serialVersionUID作用是什么?

 serialVersionUID适用于Java的序列化机制。

简单来说,Java的序列化机制是通过类的serversionUID来验证版本一致性的。在反序列化时,JVM会将传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。

 

serialVersionUID有两种显示的生成方式:

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

二是 根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:

private static final long serialVersionUID = xxxxL;

 

对象的序列化主要有两种用途:

1)把对象的字节序列永久地保存到磁盘上,通常存放在一个文件中;

2)在网络上传送对象的字节序列。

 

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream

代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 只有实现了Serializable或Externalizable接口的类的对象才能被序列化。

Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式 。 凡是实现Serializable接口

的类都有一个表示序列化版本标识符的静态变量:private static final long serialVersionUID; 类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,

有可能会导致不同的serialVersionUID。

 

当实现java.io.Serializable接口的类没有显式地定义(JVM自动生成)一个serialVersionUID变量时候,Java序列化机制会根据编译的Class自动生成一个serialVersionUID作序列化版本,这种情况下,如果Class文件(类名、方法名等)没有发生变化(增加空格、换行、增加注释等等),就算编译多次,servialVersionUID也不会变化的。

 

如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本(无特别要求,一般都是这样的),就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行序列化和反序列化。

 

serialVersionUID显示定义的必要性

在分布式部署的应用中,可能会存在漏掉一两台设备的服务器代码没有及时更新,因此这两台设备中类的serialVersionUID可能存在不同。如果版本号不显示定义,则serialVersionUID则会不同,网络传输或者数据读取时,反序列化就会出现问题。

 

具体的序列化过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID进行比较,如果一致就说明序列化类的版本与当前类的版本是一样的,可以反序列化成功,否则失败。

 


JavaBean规范中为什么要实现java.io.Serializable接口实现序列化?

 

应用场景一:

客户端访问了某个能开启会话功能的资源,web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要占用一定的内存空间。

如果在某一个时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在它们超时之前,一直占用web服务器内存资源。

 

web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,服务器要使用它们时再将它们从文件系统或数据库中装载入内存,这种技术称为Session的持久化。

 

将HttpSession对象保存到文件系统或数据库中,需要采用序列化的方式将HttpSession对象中的每个属性保存到文件系统或数据库;将HttpSession对象从文件系统或数据库中装载入内存时,需要采用反序列化的方式,恢复HttpSession对象中的每个属性。

 

存储在HttpSession对象中的每个属性对象必须实现Serializable接口,当然如果不是存储在Session中的JavaBean可以不用实现,当然了,规范呢,还是实现比较好。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155685.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 也谈谈动态绑定dropdownlist(1)

    也谈谈动态绑定dropdownlist(1)说来,很多的dropdownlist选项都不是固定的,是会动态改变的,一种方法是在页面上写死,改变时,直接修改页面就可以了。但是很多人是使用动态绑定的,因此dropdownlist的Text和Valu

    2022年7月3日
    23
  • OutputStreamWriter 源码分析

    OutputStreamWriter 源码分析字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。为了获得最高效率,可考虑将OutputStreamWriter包装到BufferedWriter中,以避免频繁调用转换器。例如:Writerout=newBufferedWriter(newOutputStreamWriter(System.out));[code="j…

    2022年9月11日
    0
  • 再议公交查询算法

    再议公交查询算法

    2021年7月23日
    65
  • process information unavailable

    process information unavailable今天在虚拟机kill进程的时候出现了processinformationunavailable出现这个问题的原因呢?其实很简单,就是你用A用户创建了一个进程,然后你用B用户把他干掉了,虽然是干掉了,但是查看的时候会出现这个该怎么解决呢?首先我们进入到tmp目录下,用ls查看,你会发现有几个以hsperfdata_开头的文件然后你点进去看的时候就知道那个进程是哪个用…

    2022年9月16日
    0
  • 集群软件的分类「建议收藏」

    集群软件的分类「建议收藏」集群软件的分类   在现在存储环境中,集群软件是一个很重要的模块。然而,很多人不清楚集群软件的分类,不知道oracle的RAC,IBM的HACMP,Symantec的VCS和EMC的AutoStart,甚至一些用户写的脚本,分别属于哪一类,它们之间有什么相同和不同的地方:   一般来讲,集群软件根据侧重的方向和试图解决的问题,分为三大类:高性能集群(Highperforma

    2022年10月16日
    0
  • Java常用的几种属性拷贝工具类使用总结

    怕什么真理无穷,进一步有近一步的欢喜文章目录开头聊几句Java属性拷贝工具类使用总结字段和属性使用说明**org.springframework.beans.BeanUtils#copyProperties**org.apache.commons.beanutils.PropertyUtils#_copyProperties_org.apache.commons.beanutils.BeanUtils#_copyProperties原理探索Spring#BeanUtilsapache.commons#.

    2022年3月1日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号