JavaBean中的serialVersionUID

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express) 首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。 阅读详情
serialVersionUID是可序列化类的一个版本标识,在反序列化的时候使用这个标识的值来判断序列化和反序列化的对象类型是否一致。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidClassException)。当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义之。 Eclipse中有两种生成方式:

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

一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:“private static final long serialVersionUID = -8940196742313994740L;”。

使用serialVersionUID要注意以下几点:

1.当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本中未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

2.记住应该总是在可序列化的类中包含这个字段,即使是在第一个类版本中,以便提醒自己这个字段的重要性。不要在未来的版本中改变这个字段值,除非你有意要改变类使其与旧的序列化对象不兼容。

3.如果你的类序列化到硬盘上面后,你更改了类别的field(增加或减少或改名),当你反序列化时,就会出现异常的,这样就会造成不兼容性的问题。但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。

4.当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。但如果在开发大量需要序列化的类的时候,建议还原为原来的设置。这样可以保证系统的性能和健壮。

5.更多关于可序列化对象的版本控制问题,看这里:
http://download.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678

未设置serialVersionUID应用举例:

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中,说白了,就是能将一个2进制文件变成内存中的对象。在JAVA中,要实现这种机制,只要实现Serializable接口就可以了,先看下面这个简单例子,serialVersionUID稍后引出。我们先定义一个简单的Person类,然后创建这个对象,最后序列化它到一个文件。

import java.io.Serializable; 

public class Person implements Serializable { 
private String name; 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
} 

import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
public class WhySerialversionUID { 
public static void main(String[] args) throws Exception { 
Person person= new Person(); 
person.setName("jack"); 
ObjectOutputStream oo = new ObjectOutputStream (new FileOutputStream(new File("E://jack.test"))); 
oo.writeObject(person); 
oo.close(); 

import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
public class WhySerialversionUID { 
public static void main(String[] args) throws Exception { 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:\\jack.test")));
Person person = (Person)ois.readObject(); 
String name= person.getName();
System.Out.Print("name is: "+name);
一切都那么顺利,但是如果在序列化之后,Person这个类发生了改变呢?比如,多了一个成员变量。我们做如下试验,还是先将对象序列化到一个文件中,之后在Person这个类中添加一个成员变量,如下:

import java.io.Serializable; 
public class Person implements Serializable { 
private String name; 
//添加这么一个成员变量 
private String address; 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
}

之后,我们再去运行一下还原,就发现运行出错了,会报如下错误:
Exception in thread “main” java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8383901821872620925, local class serialVersionUID = -763618247875550322
意思就是说,文件流中的class和classpath中的class,也就是修改过后的class,不兼容了,处于安全机制考虑,程序抛出了错误,并且拒绝载入。那么如果我们真的有需求要在序列化后添加一个字段或者方法呢?应该怎么办?那就是自己去指定serialVersionUID。之前,在我们的例子中,我们是没有指定serialVersionUID的,那么java编译器会自动给这个class进行一个摘要算法,类似于指纹算法,只要这个文件多一个空格,得到的UID就会截然不同的,可以保证在这么多类中,这个编号是唯一的。所以,我们添加了一个字段后,由于没有显指定serialVersionUID,编译器又为我们生成了一个UID,当然和前面保存在文件中的那个不会一样了,于是就出现了2个号码不一致的错误。因此,只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法可以用,呵呵。但是serialVersionUID我们怎么去生成呢?你可以写1,也可以写2,都无所谓,但是最好还是按照摘要算法,生成一个惟一的指纹数字,eclipse可以自动生成的,jdk也自带了这个工具。一般写法类似于
private static final long serialVersionUID = -763618247875550322L;在引用serializable这个类的前面有一个感叹号,单击这个感叹号后会有提示,一个是默认的,一个为此类自动产生一个SerialVersionUID!

【微服务】Spring Aop原理深入解析 spring原理深度解析 阅读详情

相关推荐

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4978

java实体类中的序列化 和serialVersionUID

是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

qq_39187593的博客 1950

从零开始:使用PacBio HiFi和ONT超长读取组装基因组(保姆级教程)

本文提供了一份从零开始的基因组组装保姆级教程,详细讲解了如何融合PacBio HiFi高精度读长与ONT超长读长数据。内容涵盖数据质控、预处理、混合组装策略选择、结果评估及Hi-C支架构建等关键步骤,旨在帮助研究人员获得高质量的完整基因组。

weixin_29266647的博客 203

对Java对象序列化serialVersionUID的理解

serialVersionUID按字面上意思来理解是序列化版本号,用以下例子可以得出serialVersionUID的实际作用 Person类: public class Person implements Serializable{ private String name; private int age; public Person(String name, int age)

从不吹牛逼 2496

DIY T12烙铁头驱动难题:用几个电容二极管,搞定NMOS上管驱动(附Multisim仿真)

本文详细介绍了如何利用电荷泵电路解决DIY T12烙铁头驱动中的NMOS上管驱动难题。通过巧妙组合电容和二极管,构建低成本高效的升压电路,实现栅极高压驱动需求。文章包含具体电路设计、元件选型建议、实际搭建注意事项以及Multisim仿真验证,为电子爱好者提供了一套完整的解决方案。

weixin_33640562的博客 334

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3834

Java中 serialVersionUID 的作用

Java中 serialVersionUID 的作用 参考网址: https://mp.weixin.qq.com/s/yQTpkbAUT096tM9HGFkWbQ serialVersionUID作用 serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就

java技术博客 357

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5820

JavaBean (实现 Serializable(可序列化) 接口的类) 里 serialVersionUID 的作用

serialVersionUID作用:         序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 有两种生成方式:        一个是默认的1L,比如:private static final long serialVersionUID = 1L;        一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:       

Tuzki_520的专栏 1877

CentOS 7 安装 Python 3.10

我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。

bensonyang888的博客 2905

Python新手必看:5分钟搞定睿尔曼机械臂基础控制(附代码示例)

本文为Python新手提供了快速上手睿尔曼机械臂基础控制的实战指南。通过详细的步骤讲解和代码示例,介绍了从环境搭建、网络配置、SDK安装到建立连接、执行关节运动(movej)、直线运动(movel)等核心控制指令的全过程,帮助零基础开发者快速实现机械臂的基础操控。

hp777的博客 328

Java之serialVersionUID

我们经常在JavaBean类遇到这样一行代码:  private static final long serialVersionUID = -1621157410689606874L; 它有什么作用呢?带着疑问,让我们先来了解一下serialzable。 通常javabean类都会implements serialzable,serialzable顾名思义就是序列化,但“序列化”这词有拗口了,我...

LVXIANGAN的专栏 792

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7439

Android JavaBean对象 自动添加serialVersionUID

Android Studio 设置自动添加serialVersionUID: 首先在创建写类后,将此类class类文件 implements Serializable File->Setting->在搜索栏中搜索Inspections->在右侧找到Java->Serialization issues->Serializable classes Without a...

fyldragonfyl 270

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Intellij IDEA自动生成serialVersionUID【不需要插件】

我们经常需要对Java Bean进行序列化,但是默认情况下继承了Serializable接口的类,Intellij IDEA不会自动生成serialVersionUID,需要手动生成,比较麻烦。网上有一种通过IDEA插件的解决方案,但是还有一种更为简便的设置,能直接让IDEA自动帮我们生成serialVersionUID。 只需要在Preferences里面进行设置。 如下图:Preferen...

D调的华丽 3006

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA如何快捷创建serialVersionUID【详细图解】

IDEA如何快捷创建serialVersionUID,IDEA快捷生成JavaBean的serialVersionUID

Acloasia的博客 2642

Intellij IDEA生成serialVersionUID

默认情况下Intellij IDEA不会提示继承了Serializable接口的类生成serialVersionUID的警告。如果需要生成serialVersionUID,就要在Preferences里面进行设置。 如下图:Preferences -> Inspections -> Serialization issues -> Serialization class with...

chang_ge的博客 5368

idea生成serialVersionUID

默认情况下Intellij IDEA不会提示继承了Serializable接口的类生成serialVersionUID的警告。如果需要生成serialVersionUID,就要在Preferences里面进行设置。 如下图:Preferences -> Inspections -> Serialization issues -> Serialization class witho...

weixin_30492047的博客 123

Javas_socket传递JavaBean(案例)

[code="java"] 测试socket传递JavaBean 1、JavaBean必须实现序列化(implements Serializable) 2、如果JavaBean中有(private static final long serialVersionUID = 1L;)版本号,则server端和client端都必须要有一致的版本号 3、JavaBean的包名在server端和cl...

ydq402的专栏 206

Memcache 获取 javabean NullPointerException

接到任务要对项目进行小的业务修改,涉及增加数据库字段,因为用到hibernate,所以对相应JavaBean也需做修改,原以为就这么简单就完事了!后同事提醒说这个JavaBean很多项目中都有,因为需设置到Memcache中,所以需连带都作修改了,而且需同步更新项目,一查看,N多个项目都有,尼玛头大了,因为原先未接触过Memcache,所以也不好发表意见,但感性告诉自己,Memcache应...

学习点滴 256

关于javabean显式UID的作用

如果一个javabean实现了Serializable接口,那么它可以实现序列化,也就有了网络传输、本地存储等功能。在这个类中经常会看到一个SerialVersionUID,它的作用是这样的: 首先,实现序列化的类中如果没有显式声明SerialVersionUID,这个类在编译时,编译器会生成一个唯一的,隐式的UID,这个UID是由很多因素决定的,包括类的非私有方法和属性等,那么当这个类做了...

chaoge的it成长之路 406

Java基础-JavaBean

Java基础-JavaBean 什么是JavaBean? 首先,一个java bean 其实就是一个普通的java 类, 但我们对这个类有些要求: 所有属性为private 提供默认构造方法 提供getter和setter 实现serializable接口 一个合格的JavaBean应该具备以上特点,它不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用 Serializable接口 什么是 Serializable接口

LyrZn的博客 210

serialVersionUID详解

本人学习笔记,仅供自己查阅 Java类中serialVersionUID作用是什么? serialVersionUID适用于Java的序列化机制。 简单来说,Java的序列化机制是通过类的serversionUID来验证版本一致性的。在反序列化时,JVM会将传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为...

weixin_30673611的博客 668

自动生成javabean

2023年最新地推相关信息 970

3.3学习日志-javaBean中常见问题

1.javaBean为何要继承序列化接口:将HttpSession对象保存到文件或系统数据库中,需采用序列化方式,反之需采用  反序列化。 2.instanceof运算符:运行时指出对象是否是特定类的一个实例,返回一个布尔值。如:object instanceof interface,对  象实现接口,比较为true,对象和父类判断为true,对象和子类判断为false。

qq_36173194的博客 637

java.io.NotSerializableException: XXX

在服务器重启的时候报错 一般的服务器停止的时候都会将session钝化,将其写入到文件中,并且在重新启动的时候再将其锐化,恢复重启前的session信息,所以如果你放入session中的类没有实现jNotSerializableException的话,服务器启动的时候就会出现这个异常 所以要在对应po类上实现Serializable,还要生成serialVersionUID 还有一种情况就是开...

weixin_42404323的博客 773

java bean 序列化_javabean为什么要实现序列化?

javabean为什么要实现序列化?所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得...

weixin_30539747的博客 298
上一篇: conversion to dalvik format failed with error 1的解决办法
下一篇: How Android Draws Views
myshapozi
博客等级 码龄16年 4粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值