Java中实现Serializable接口为什么要声明serialVersionUID?

java序列化 1.java序列化需要实现java.io.Serializable接口,表示这个类可以实现序列化,Serializable中没有任何方法。2.实现序列化的类需要声明serialVersionUID,表明版本,在反序列化时保证类没有被改变。(例如:将一个可序列化的对象存入文件中,这 阅读详情

实现序列化接口Serialize的时候,如果不指定serialVersionUID 的值,编译时就会出现警告,为什么?

什么情况下需要修改serialVersionUID 的值?
      序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:

      如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议所有可序列化类都显式声明 serialVersionUID 值,原因计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。

      因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修改器显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID 字段作为继承成员没有用处。

实现Serializable就一定需要写serialVersionUID 1.代码刚更新就有同事找我报错了 com.voc4cloud.voc.admin.api.dto.UserInfo; local class incompatible: stream classdesc serialVersionUID = -6423749437980912546, local class serialVersionUID = 8189966274600548814` 2.发现: 通过查看日志发现是序列化报错了 3.原因: 因为新增了一个字段 , 而这个类没有写serialVersio 阅读详情

相关推荐

Serializable接口:序列化

最近这段时间一直在学习java框架,麻木地搬着Ctrl-C、Ctrl-V的砖,在不知道重复了多少次定义Java实体对象时“implements Serializable”的C/V大法后,脑海中突然冒出一个思维(A):问了自己一句“Java实体对象为什么一定要实现Serializable接口? 查看 官方文档 就会发现 Serializable接口中一个成员函数或者成员变量也没有。那么这个接口的作用是什么呢。网上找了一些博客看过之后,知道这个接口的作用是实现序列化。 那什么是序列化呢? Serializa

zhangYt的博客 1285

Java实现Serializable接口为什么声明serialVersionUID

一句话解释就是:在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类,再简化就是为了反序列化后验证兼容性。 如果不声明会对类进行计算产生默认值,但是这种默认值充满不确定性,不方便。 如果可序列化类未声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值。强烈建议所有可序列化类都显式声明 serialVersionUID 值。默认的 serialVer...

wqdsfwer的博客 1465

为什么实现Serializable接口还要指定serialVersionUID值呢?

什么是序列化与反序列化 你在平时的开发中肯定发现实体类会实现Serializable接口,并且指定serialVersionUID的值。像这样 你可能会有疑问,为什么实现Serializable接口呢。实现这个接口是为了序列化和反序列化。 如果这个实体类有内存和硬盘的数据交互,或者内存与网络的数据交互时,就需要序列化和反序列化了。这时不实现Serializable接口就会出现java.io.NotSerializableException异常。 那么什么是序列化和反序列化呢? “ 序列化

wujialv的博客 5180

Java 实现Serializable接口声明serialVersionUID的原因

原因如下: 1.如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:  2.如

重心开始,重新开始 1801

Serializable接口

Serializable接口概述 Serializablejava.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可...

郝啊的博客 1275

为什么定义实体类要实现Serializable接口以及何为序列化和反序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

weixin_60800735的博客 311

Serializable接口serialVersionUID作用

SerializableJava提供的序列化接口,是一个空接口,为对象提供标准的序列化与反序列化操作。使用Serializable实现序列化过程相当简单,只需要在类声明的时候指定一个标识,便可以自动的实现默认的序列化过程。 private static final long serialVersionUID = 1L; 上面已经说明让对象实现序列化,只需要让当前类实...

ying3072的博客 2370

The serializable class User does not declare a static final serialVersionUID field of type long警告

在学习JAVA程序设计的时候,出现了一段这样警告: The serializable class User does not declare a static final serialVersionUID field of type long 当你一个类实现Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义,强烈建议所有可序列...

one-way or another 1591

the serializable class XXX does not declare a static final serialVersionUID field of type long

今天在编写Java程序的时候,发现这个警告提示,于是google了一下。得到答案如下: If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for t...

weixin_34163553的博客 437

java 只去掉_30行代码带你了解JavaSerializable接口

最近本栈在阅读Java的源码,发现JDK的String类实现Serializable接口,并定义了一个serialVersionUID变量,它知道这个接口是为了让String类能够序列化与反序列化,但是为什么实现这个接口才能序列化与反序列化呢?我们都知道,Serializable接口是为了让String对象可以被序列化与反序列化的,本着实践出真知的精神,我们一起来探索下如果不实现这个接口,会出...

weixin_39964528的博客 111

关于The serializable class XXX does not declare a static final serialVersionUID field of type long的警告...

今天在编写Java程序的时候,发现这个警告提示,于是google了一下。得到答案如下: If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value ...

afgv97004的博客 100

idea serializable 生成id 快捷键_30行代码带你了解JavaSerializable接口

最近本栈在阅读Java的源码,发现JDK的String类实现Serializable接口,并定义了一个serialVersionUID变量,它知道这个接口是为了让String类能够序列化与反序列化,但是为什么实现这个接口才能序列化与反序列化呢?我们都知道,Serializable接口是为了让String对象可以被序列化与反序列化的,本着实践出真知的精神,我们一起来探索下如果不实现这个接口,会出...

weixin_39892481的博客 267

Idea中类实现Serializable接口 引入 serialVersionUID

idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serialization issues>勾上Serializable class without “serialVersion” 的框,完成实现 转载于:https://ww...

weixin_30819163的博客 188

JAVA 序列化 serialVersionUID

之前对实现java.io.Serializable接口的每个类都需要提供一个serialVersionID感觉很迷惑,参考了JAVA的API后,稍微懂了点。以下是摘自JDK1.6的官方文档: [code="java"] 如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(T...

Sweet之家 190
上一篇: 从Trie树说到后缀树
下一篇: Java中volatile的作用以及用法
imzoer
博客等级 码龄14年 588粉丝 339原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值