你的JavaBean是否真的需要实现Serializable
众所周知
如果一个对象需要进行网络传输,那么该对象就需要实现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接口。
最新文章
- json中含有Unicode的处理办法 C#
- 关于Redis数据过期策略
- Android四大基本组件介绍与生命周期
- 【笔记】jquery append,appendTo,prepend,prependTo 介绍
- 关于spring配置文件properties的问题
- JDE开发端安装问题(JDE初步卸载重装)
- 025. asp.net中GridView的排序和过滤
- 如何使用 EXCEL 的筛选功能
- KEEPALIVED 检测RS原理
- ios开发之C语言第3天
- wcf异常汇总
- MATLAB获取“非免驱的相机或者摄像头”的图像数据
- Java中常见数据结构Map之LinkedHashMap
- Vector 特性
- Ajax请求二进制流并在页面展示
- 对接https数据(3des加密)
- 这3周以来的面试总结(C#/.net 智能硬件/物联网)
- docker日志清理
- hdu-3790 最短路径问题(双重权值)
- 使用ramdisk内存分区给常用软件加速