众所周知

如果一个对象需要进行网络传输,那么该对象就需要实现Serializable接口,为了防止反序列失败,该对象需提供一个默认的serialVersionUID(该值在反序列化的时候会进行校验校验失败并抛出InvalidClassException异常)。

提出疑问

现在需要将一个对象返回给前端,那么该对象是否需要实现 Serializable接口,并提供一个默认的serialVersionUID?如果不实现会有什么影响?

探索

我们现在想一个问题,现在一般前后端进行数据交互一般都是json格式的数据,那么是谁在什么时候将我们的对象转换成json格式的?只要想明白这个问题,也就解决了我们提出的疑问。

这里我先用SpringMVC框架做一番解释,我们使用SpringMVC框架的时候如果要返回一个json串给前端只需要将对象返回并且在方法上加上@ResponseBody注解,类似以下操作

SpirngMVC是什么类在什么时候处理@ResponseBody

SpringMVC 中处理@ResponseBody主要是通过类RequestResponseBodyMethodProcessor#handleReturnValue处理返回值,解析成json又涉及到的HttpMessageConverter的配置,其实正常情况下SpringMVC是自动帮我们配置以下转换器:

ByteArrayHttpMessageConverter,

StringHttpMessageConverter,

ResourceHttpMessageConverter,

SourceHttpMessageConverter,

AllEncompassingFormHttpMessageConverter,

是否引入jackson包配置MappingJackson2HttpMessageConverter。

具体详见WebMvcConfigurationSupport#addDefaultHttpMessageConverters。一般执行解析操作的是MappingJackson2HttpMessageConverter这个类,其实这个类不是干实事的,具体操作还得交给ObjectMapper这个类取实现。而ObjectMapper就是jackson包中的一个类。

jackson是怎么将对象转换成json

jackson将对象解析成json的入口是ObjectMapper#writeValueAsString,其内部实现大概是先初始化一个4000容量的WriterBasedJsonGenerator#_outputBuffer char数组,然后将对象中的字段一一往char数组中放入,最后将char数组转换成String。具体详见ObjectMapper#writeValueAsString,因此对象转换成json与Serializable无关。

验证

这里主要验证对象返回是否与Serializable有关系,如果一个对象进行序列化跟实现Serializable有关系的话,那么序列化的过程中一定就会调用该对象下的writeObject(java.io.ObjectOutputStream s) ,因此只需启动程序调用接口,在方法writeObject上打断点,看是否可以拦截住。这里使用HashSet做实验。会发现断点没有停住。说明使用SpringMVC框架返回给前端的对象无需实现Serializable接口。其大致图如下

因此真正与网络传输打交道的是SpringMVC转换后的json字符串,实体对象与网络并没用直接的接触,所以这里的实体对象无需实现Serializable接口。

什么时候需要实现Serializable接口

还是那句话,如果你的对象需要网络传输或者持久化(对象直接转换为字节的形式传输),只要你的对象需要转换为字节的形式那么你的对象就要实现Serializable接口。比如使用dubbo使用rpc的方式调用接口,那么接口参数就一定要实现Serializable接口。

总结

一般来说如果你的对象需要网络传输或者持久化(对象直接转换为字节的形式传输),那么就需要实现Serializable接口。如果只是转换为字符串的形式与网络打交道,那么就不需要实现Serializable接口。

你的JavaBean是否真的需要实现Serializable的更多相关文章

  1. 为什么很多类甚者底层源码要implements Serializable ?

    为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...

  2. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  3. java开发150个建议

    阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法 建议 ...

  4. java8--IO(java疯狂讲义3复习笔记)

    产生文件 File file = new File("abc.txt"); if(!file.exists()){ System.out.println(file.exists() ...

  5. 浅谈:java泛型与dao重用

    在进入今天的主题之前,我们先理解一下什么是泛型: 泛型是java中一种类型,泛型是被参数化的类型. 类型-->class 参数化-->class类型可以是任意参数 泛型存在的意义:泛型可以 ...

  6. hibernate笔记加强版

    hibernate 一. hibernate介绍 hibernate事实上就是ormapping框架,此框架的作用就是简单话数据库的操作. hibernate就是将用户提交的代码.參照持久化类配置文件 ...

  7. Java中如何动态创建接口的实现

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务 ...

  8. SSH框架搭建最终版【测试、log4j、baseDao】

    最详细搭建SSH框架环境 本博文主要是讲解如何搭建一个比较规范的SSH开发环境,以及对它测试[在前面的搭建中,只是整合了SSH框架,能够使用SSH实现功能],而这次是相对规范的. 导入开发包 在Str ...

  9. ServletListener对象学习笔记

    JavaWeb学习笔记--监听器详解 知识概要: 1.监听器下例子举例 2.Servlet规范中的监听器 3. 4. 1. 监听器下例子举例说明: /* Frame:事件源.发生事件的对象 Windo ...

随机推荐

  1. android handle详解

    我们来看一个简单的代码: package com.mly.panhouye.handlerdemo; import android.content.Intent; import android.os. ...

  2. Python3-内置类型-集合类型

    Python3中的集合类型主要有两种 set 可变集合 可添加和删除元素,它是不可哈希的,因此set对象不能用作字典的键或另一个元素的集合 forzenset 不可变集合 正好与set相反,其内容创建 ...

  3. Python 简明教程 --- 16,Python 高阶函数

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 对于那些快速算法,我们总是可以拿一些速度差不多但是更容易理解的算法来替代它们. -- Douglas ...

  4. 使用Apache Hudi构建大规模、事务性数据湖

    一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...

  5. Unity ugui Anchor锚点自动适配画布中的相对位置

    本随笔参考了以下博客,在此基础上进行优化和改进: https://blog.csdn.net/qq_39640124/article/details/88284191 ugui中的Anchor预设如下 ...

  6. Spring 获取单例流程(三)

    读完这篇文章你将会收获到 Spring 何时将 bean 加入到第三级缓存和第一级缓存中 Spring 何时回调各种 Aware 接口.BeanPostProcessor .InitializingB ...

  7. 在执行 pip install 时遇到错误:python setup.py egg_info ...

    最近重新安装win10 64位专业版, 正好遇到python3.8发布,试了一下.结果jupyter都安装不了...心碎. ERROR: Command errored out with exit s ...

  8. css中vertical-aling与line-height

    基线 baseline:字符x的底部 x-height: 字母x的高度,vertical-aling设置为middle的时候,对齐的是baseline往上1/2的x-height,所以vertical ...

  9. 状压DP之学校食堂

    题目 传送们 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负 ...

  10. POJ 3977 题解

    题目 Given a list of N integers with absolute values no larger than \(10^{15}\), find a non empty subs ...