Java序列化的原理分析及解决

 更新时间:2024年11月16日 08:40:57   作者:赚够壹仟万  
文章介绍了Java中的序列化机制,包括Serializable和Externalizable接口的区别,以及serialVersionUID的作用,Serializable接口可以序列化的所有子类型本身都是可序列化的,如果要序列化的类有父类,父类也应该实现Serializable接口

概念

序列化是指将对象转换为可传输格式的过程。是一种数据持久化手段。

在Java的序列化机制中,如果是String,枚举或者是实现了Serializable接口的类,均可以通过Java的序列化机制,将类序列化为符合编码的数据流,然后通过InputStream和OutputStream将内存中的类持久化到硬盘或者网络中。

Serializable 和 Externalizable 接口有何不同?

Serializable接口可序列化的所有子类型本身都是可序列化的。

如果要序列化的类有父类,要想将父类中的变量也持久化下来,那么父类也应该实现Serializable接口。

Externalizable继承了Serializable,该接口定义了两个方法,当使用Externalizable接口来进行序列化和反序列化时需要重写这两个方法,如果没有定义具体的序列化细节,那么序列化之后的对象为空。

serialVersionUID有什么用?没定义会有什么问题?

虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的点是两个类的序列化ID是否一致。也即serialVersionUID一致。

在进行反序列化时,JVM会把传来的字节流中的seriaVersionUD与本地相应实体类的seriaIVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。这样做是为了保证安全,因为文件存储中的内容可能被篡改。

注意:如果在使用时不去定义SerialVersionUID,如果在序列化对象之后修改了这个类的信息(例如加一个字段)那么反序列会失败,因为会存在两个不同的SerialVersionUID.

class User implements Serializable{
	private String name;
}

如果定义了一个上述类的对象并保存到文件中(这里没有指定SerialVersionUID)。

然后修改这个类,增加一个属性。

class User implements Serializable{
	private String name;
	private int age;
}

执行反序列化时就会抛出一个InvalidClassException,并且指出两个serialVersionUID不同。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Cloud Stream微服务消息框架原理及实例解析

    Spring Cloud Stream微服务消息框架原理及实例解析

    这篇文章主要介绍了Spring Cloud Stream微服务消息框架原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java日常练习题,每天进步一点点(62)

    Java日常练习题,每天进步一点点(62)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • spring framework源码调试技巧

    spring framework源码调试技巧

    这篇文章给大家介绍了spring-framework源码调试方法,可以直接将最新代码clone到本地,如果想在代码做一些注释,也可以Fork到自己的仓库。本文采用Fork的方式,并添加了测试module,感兴趣的朋友一起看看吧
    2021-10-10
  • springboot2.6.3读取不到nacos上的配置文件问题

    springboot2.6.3读取不到nacos上的配置文件问题

    这篇文章主要介绍了springboot2.6.3读取不到nacos上的配置文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • struts2入门介绍及代码实例

    struts2入门介绍及代码实例

    这篇文章主要介绍了struts2入门介绍及代码实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot 内嵌 camunda的配置方法

    SpringBoot 内嵌 camunda的配置方法

    Camunda是一个基于Java的框架,支持用于工作流和流程自动化的BPMN、用于案例管理的CMMN和用于业务决策管理的DMN,这篇文章主要介绍了SpringBoot 内嵌 camunda,需要的朋友可以参考下
    2024-06-06
  • 一文简单了解C# 中的DataSet类

    一文简单了解C# 中的DataSet类

    这篇文章主要介绍了一文简单了解C# 中的DataSet类,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java过滤器与监听器间区别与联系

    Java过滤器与监听器间区别与联系

    监听器是一个接口内容由我们实现,会在特定时间被调用,监听器用于监听web应用中三大域对象(request,session,application),信息的创建,销毁,增加,修改,删除等动作的发生,然后做出相应的响应处理
    2023-01-01
  • thymeleaf实现前后端数据交换的示例详解

    thymeleaf实现前后端数据交换的示例详解

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎,当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示,这篇文章主要介绍了thymeleaf实现前后端数据交换,需要的朋友可以参考下
    2022-07-07
  • 零基础写Java知乎爬虫之获取知乎编辑推荐内容

    零基础写Java知乎爬虫之获取知乎编辑推荐内容

    上篇文章我们拿百度首页做了个小测试,今天我们来个复杂的,直接抓取知乎编辑推荐的内容,小伙伴们可算松了口气,终于进入正题了,哈哈。
    2014-11-11

最新评论