众所周知

如果一个对象需要进行网络传输,那么该对象就需要实现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接口。

最新文章

  1. json中含有Unicode的处理办法 C#
  2. 关于Redis数据过期策略
  3. Android四大基本组件介绍与生命周期
  4. 【笔记】jquery append,appendTo,prepend,prependTo 介绍
  5. 关于spring配置文件properties的问题
  6. JDE开发端安装问题(JDE初步卸载重装)
  7. 025. asp.net中GridView的排序和过滤
  8. 如何使用 EXCEL 的筛选功能
  9. KEEPALIVED 检测RS原理
  10. ios开发之C语言第3天
  11. wcf异常汇总
  12. MATLAB获取“非免驱的相机或者摄像头”的图像数据
  13. Java中常见数据结构Map之LinkedHashMap
  14. Vector 特性
  15. Ajax请求二进制流并在页面展示
  16. 对接https数据(3des加密)
  17. 这3周以来的面试总结(C#/.net 智能硬件/物联网)
  18. docker日志清理
  19. hdu-3790 最短路径问题(双重权值)
  20. 使用ramdisk内存分区给常用软件加速

热门文章

  1. 手把手教你使用Python抓取QQ音乐数据(第二弹)
  2. ajax前后端交互原理(1)
  3. P1131 [ZJOI2007]时态同步【树形dp】
  4. [CF1216E] Numerical Sequence hard version
  5. Oracle 11g各种服务作用以及哪些需要开启
  6. svn和GitHub的使用
  7. 洛谷P3237 米特运输
  8. 【Windows10】如何使用Segoe MDL2 Assets图标
  9. 小程序爬坑(一)之时间格式IOS的兼容
  10. Redis哨兵集群创建脚本--v1