Serializable接口

程编程时,序列化知识点经常会遇到。

张工是一名这样的 java 工程序员,工作 5 年了,一直在进行 java 开发。最近到某互联网公司面试,做了笔试题后,有偏笔试题是子的:Serializable 有什么作用, ,面谈时面试官了,张工回答不出个所以然。助,不过应该类似,可序列化序列化这样的知识点,平时应该不会少用。

在参加参加的笔试之前,会遇到关于序列化的问题,关于序列化我们会有更好的大概情况,但如果能进一步分析个所以,让面试也留下更好的印象。

一般情况下,我们在定义实体类时会继承Serializable接口,类似这样:

我们在实体类中引用了Serializable这个接口,那么这个接口到底有什么?

什么是Serializable接口

一个对象才能序列化的接口,一个类只有实现了Serializable接口,它的对象被序列化了。

什么是序列化?

轻松化这个对象与对象之间传输的状态转换的格式为可以保持或传输的序列。序列化为相对化,结合流为为。两个过程中,可以传输数据。

要序列化对象为什么

把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化什么情况下需要顺序化?

当需要将对象的状态信息通过传输进行传输,或者需要将对象的序列信息传输化网络以便我们使用时都需要将对象进行化

那是为什么继承序列化。那是对象在存储的时候,为了存储在下一次使用的时候,可以很方便的重建一个副本。

你可能会问,我在开发过程中,部署并没有实现序列化,但我同样可以将数据保存到mysql、Oracle数据库中,为什么非要序列化呢?

我们来看看Serializable到底是什么,然后去看看,我们发现Serializable接口里面什么都没有,只是个接口

一个接口里面的内容都没有,我们可以将它理解成一个接口。

在课堂上请教某位学生的一个问题,于是手向老师请教这个问题,帮助老师帮她解答这个问题,解答这位学生的举手问题。在爪哇,自己解决不了这个Serializable接口其实是给jvm看的,通知jvm,我不对这个类做序列化了,你(jvm)帮我序列化就好了。

可序列化接口就是Java地提供高效率的共享实例对象的机制,实现这个接口能够。

什么是JVM?

JVM是Java虚拟机的简称,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的模拟计算机各种功能来实现的。

要定义serialversionUID变量

简单看一下Serializable接口的说明

从说明中我们可以看到,如果我们没有自己声明一个serialVersionUID,接口会默认生成一个serialVersionUID变量

但是,<em>强烈建议</em>所有可序列化的类都显式声明 serialVersionUID 值,因为默认的 serialVersionUID 计算对类细节高度敏感,这些细节可能因编译器实现而异,因此可能导致意外<code>反序列化期间的 InvalidClassException</code>s。

强烈建议用户自定义一个serialVersionUID,因为默认的serialVersin对于class的细节非常敏感,反化时可能会导致DinvalidClassException这个异常。

在前面我们已经新建了一个实体类用户实现Serializable接口,并定义了serialVersionUID变量。

我们把用户写到文件,然后读取出来。

     

 

是的,你看恢复的顺序就是这么简单前面有过一个问题,如果将serialVersionUID删除,我们来看看,会发生什么。

刚刚开始提到,serial UID要不要什么时候指定会出现之后的结果? 。

这个serialVersionUI是使用D与对象的序列反序列化后的序列化,该序列化后的序列化UID的序列化UID一致,该对象的能力被该对象的序列化与序列化的序列化成功。serialVersionUID机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测中的serialVersionUID是否跟当前文件的serialVersionUID是否一致,如果一直化成功,否则就说明当前跟序列的类发生变化,或者是成员变量的类型发生了变化,那么在反序列化化时间发生了崩溃,并且报错:

java.io.InvalidClassException:用户;本地类不兼容:流 classdesc serialVersionUID = -1451587475819212328,本地类 serialVersionUID = -3946714849072033140在 java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)在 Main.readUser(Main.java:32)在 Main.main(Main.java:10)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值