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可以不用实现,当然了,规范呢,还是实现比较好。

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java中int转long

    java中int转longpackagepid69;publicclassSolution{ publicstaticintmySqrt(intx){ intresult=0; if(x==0||x==1){ returnx; }else{ for(inti=0;i<=x/2;i++){ inta=i*i; //防止溢出,务必注意右边需…

  • pycharm添加库_pycharm自带python吗

    pycharm添加库_pycharm自带python吗pycharm添加pythonpath文件不在要添加的目录底下有时候需要添加一个包,但是那个包就是一个很随意的路径,并不在python27文件夹底下,如何做呢?-如果这个包是正规的包,有init.py这个文件,那就容易了。如果是自己写的一个包,这个文件要加上,可以为空-在pycharm中点击File->settings->projectXXX->ProjectInterprete

  • VCS仿真VHDL VERILOG混合脚本「建议收藏」

    VCS仿真VHDL VERILOG混合脚本「建议收藏」#!/bin/csh#虚拟路径.PHONY:comsimcovcleandebug#DEFINEALL_DEFINE=+define+DUMP_VPD #预编译宏定义,本例程没有用到宏定义#OUTPUHTOUTPUT=simv #输出文件的文件名#Codecoveragecommand#覆盖率检查CM=-cmline+cond+fsm+branch+tgl#收集的代码覆盖率类型CM_NAME=-c..

  • BusyBox下载安装教程

    BusyBox下载安装教程文章目录BusyBox下载安装教程简介下载压缩包开始安装BusyBox下载安装教程简介BusyBox是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将BusyBox称为Linux工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令,也包含了Linux系统的自带的shell。B

  • 图像搜索引擎「建议收藏」

    图像搜索引擎「建议收藏」ListofCBIRenginesFromWikipedia,thefreeencyclopediaJumpto:navigation,searchThisisalistofpubliclyavailableContent-basedimageretrieval(CBIR)engines,theseimagesearc

  • 大数据,云计算,物联网三者的区别和关联方法_云计算和物联网的应用

    大数据,云计算,物联网三者的区别和关联方法_云计算和物联网的应用大数据时代的到来,是全球知名咨询公司麦肯锡最早提出的,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”《互联网进化论》一书中提出“互联网的未来功能和结构将于人类大脑高度相似,也将具备互联网虚拟感觉,虚拟运动,虚拟中枢,虚拟记忆神经系统”,并绘制了一幅互联网虚拟大脑结构图。…

发表回复

您的电子邮箱地址不会被公开。

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