众所周知

如果一个对象需要进行网络传输,那么该对象就需要实现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. IOT设备SmartConfig实现

    一般情况下,IOT设备(针对wifi设备)在智能化过程中需要连接到家庭路由.但在此之前,需要将wifi信息(通常是ssid和password,即名字和密码)发给设备,这一步骤被称为配网.移动设备如An ...

  2. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  3. Java中时间加减的比较

    public class TestDate{ public static void main(String[] args){try{ Date date=new Date(); DateFormat  ...

  4. 图解resilience4j容错机制

    Resilience4j是一个轻量级.易于使用的容错库,其灵感来自Netflix Hystrix,但专为Java 8和函数式编程设计.轻量级,因为库只使用Vavr,它没有任何其他外部库依赖项.相比之下 ...

  5. JavaScript基础函数的配置对象Configuration Objects(020)

    配置对象通常用在API库的实现中,当程序中需要编写要多次的模块,也可以采用这种模式.这种模式的好处是接口明确,扩展方便.比如,一个 addPerson在设计的最初需要两个参数作为初始化时人的姓名: f ...

  6. 抓包工具-Charles基础使用

    正在整理,等待编辑过后更新....... 竟然字少不能发不出去 那..... 现..... 在..... 够..... 了..... 吗?????? 不..... 够..... 我..... 在... ...

  7. Linux 文件类型 ,文件权限

     第一个字符段:文件类型.第二个组字符段又分为三段(每三个字符为一段不足用‘-’):文件属性. . drwxrwxrwx . -rwxr-xr-x 第一字符段: 第二字符组段依次为: - :普通文件  ...

  8. 版本管理工具(git)

    Git是一个开源的分布式版本控制系统 工作区: 电脑目录中,git_test文件夹就是一个工作区. 版本库: 在进行git操作的时候,会生成一个隐藏目录.git,这是git的版本库,其中stage(或 ...

  9. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  10. 1. 初识Jackson -- 世界上最好的JSON库

    要想人前显贵,必须背后受罪.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...