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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java和Java大数据有什么区别?

    Java和Java大数据有什么区别?单单提起java或者大数据,很多人对此都一目了然,但对于Java大数据这样一个新鲜名词,多少有些疑惑。那java和java大数据学习的内容是一样的吗?两者有什么区别呢?今天就从java和java大数据的以下方面谈谈两者的区别。Java和Java大数据有什么区别Java和大数据的关系:java是计算机的一门编程语言;可以用来做很多工作,大数据开发属于其中一种;大数据…

    2022年5月25日
    43
  • war包和jar包的区别

    war包和jar包的区别jar包:对于学习java的人来说应该并不陌生。我们也经常使用也一些jar包。其实jar包就是java的类进行编译生成的class文件就行打包的压缩包而已。里面就是一些class文件。当我们自己使用maven写一些java程序,进行打包生成jar包。同时在可以在其他的工程下使用,但是我们在这个工程依赖的jar包,在其他工程使用该jar包也要导入。这是jar的里面的class文件war包…

    2022年5月24日
    48
  • docker安装RabbitMQ「建议收藏」

    docker安装RabbitMQ「建议收藏」docker安装RabbitMQ查看仓库里的RabbitMQdockersearchrabbitmq安装RabbitMQdockerpullrabbitmq这里是直接安装最新的,如果需要安装其他版本在rabbitmq后面跟上版本号即可启动RabbitMQdockerrun-d–hostnamemy-rabbit–namerabbit-p15672:15672-p5672:5672rabbitmq安装插件先执行dockerps拿到当前的镜像ID

    2022年5月24日
    39
  • PHP基础

    PHP基础前言发现PHP审计和利用的一些漏洞利用场景挺有意思的,来学习一下php基础内容,大部分概念和代码和Java或c++的差不多,挑些php独有的特性来做记录。基础知识超级全局变量PHP

    2021年12月13日
    40
  • windows 多线程_关于多线程的技术分享

    windows 多线程_关于多线程的技术分享本文内容较为详细,关于更简短的一篇介绍,请看这里:https://blog.csdn.net/weixin_45525272/article/details/105057120多线程同步技术在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进…

    2022年8月18日
    7
  • WerFault.exe 占用CPU 100%的问题处理[通俗易懂]

    WerFault.exe 占用CPU 100%的问题处理[通俗易懂]转载自:https://technet.microsoft.com/en-us/library/cc754364(v=ws.11).aspx关于禁用WerFault.exe进程的操作方法,网络上的其它设置都不生效,通过官方给出的操作,完美的禁用了此进程,适用于win2008。AppliesTo:WindowsServer2008R2WindowsErrorRe…

    2022年6月15日
    33

发表回复

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

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