Java model 对象必须实现 Serializable 吗?

sawyera

前言

我实习生。

今天( 2020-09-29 ),组长 review 我的代码时发现我 model 中的对象都没有实现 Serializable 接口,告诉我:”写得不对,所有有关落库、网络传输的对象都必须实现 Serializable 接口“。我不以为然,我印象中此接口是需要逐渐被废弃使用的,并且只有使用 Java 原生的序列化机制时才需要此接口。

我检查代码后还是觉得没必要实现 Serialzable 接口,原因:

  1. rpc 业务层面使用 fastjson 编解码 json String

  2. mybatis 的操作与 Serialzable 接口无关

  3. 业务层面前端入参和出参的 vo 也是 fastjson 编解码 json String

  4. 查了资料复习此接口的使用,发现和我印象中的理解偏差不大

以上,我认为此项目 model 中的对象不需要实现 Serializable 接口。

随后和组长、一些同事讨论了下,他们一致认为必须实现 Serialzable 接口,理由:

  1. 有序列化的地方必须实现

  2. 落库的对象必须实现

  3. rpc 传输的对象必须实现

  4. 老的代码都实现了 Serialzable 接口,没有人是不这么做的,别想偷懒

  5. 老的项目中不实现 Serialzable 接口,然后踩坑了

我用我的原因进行反驳,同事的口径大致是:”如果我有能力承担不实现 Serialzable 接口带来的后果,那就不实现“。

后续

我老老实实地把 model 中的对象都加上了 Serialzable 接口。

后续怎么想怎么不对,我感觉自己的想法没错,我只是想把代码写得干净一点,想来问问大家对此接口的看法。

问题

  1. Java model 对象必须实现 Serializable 吗?想知道大家都此接口的理解

  2. 如果我的想法没错,那么同事对 Serializable 接口的理解是否反映某些问题?

一些参考: https://v2ex.com/t/696834

mightofcode:不一定
java 自己内嵌了很多机制,比如 Serializable,Serializable 不是必须的,没有 Serializable 你也一样写程序,甚至比 Serializable 做的更好

Serializable 不好用,java 自带的序列化也做的不行,这两个都建议别用了

mightofcode:你们应该有测试吧
业务能跑就说明没问题

你的同事有点僵硬

zsdroid:所以坑呢?

chenshun00:我寻思着 Serializable 接口也没被标明 @Deprecated 啊,你印象中的「此接口是需要逐渐废弃使用的」是如何得来的. 🙂

难道你们的 RPC 都走的是字符串. 🙂

sawyera:@mightofcode 我也认为测试业务能跑就说明没问题,但是同事用一个奇葩的理由反驳我:”一百次成功也说明不了问题,不实现 Serializable 的话,可能下次调用就失败了,到时候吐空数据给前端你能承担后果吗?“

@zsdroid 我让同事复现坑,同事复现不出来,说”之前好像使用 jackson 序列化不实现 Serialzable 的类会报错“,然后就别人的代码都这么写你也要这么写、承担后果之类的话

oneisall8955:学习这个接口的时候,Demo 是序列化到磁盘,课本中说还有一个作用是网络传输。很疑惑的是现在接口间都是 json 作为介质了吧。另外缓存到 redis 默认情况也是转 json 字符串到内存 value 的。
现在就职的公司代码生成器生成代码是实现了这个接口,我每次生成新代码都删掉了,觉得很碍地方。。。
以前公司也没见用

idoggy:落库的对象要序列化,这系统至少六年朝上了吧

billlee:需要考虑性能的地方都不用。Json/kryo/protobuf 哪个不比 serializable 好用

huifer:如果需要使用 ObjectOutputStream ObjectInputStream 那么必须实现. 如果说落入 DB , 这可以不需要. mybatis jpa 应该没有强制要求. 如果是 fastjson 或者其他 json 序列化通过这类工具反序列化和序列化都没有强制要求实现 Serializable 接口. redis 这类都提供了序列化方式的重写接口,通过这些重写可以替换掉原有的,即可以转换为 fastjson 等序列化工具.

ssynhtn:你的同事水平有点低啊

sawyera:@chenshun00 「此接口是需要逐渐废弃使用的」相关文章: https://adtmag.com/articles/2018/05/30/java-serialization.aspx 和之前学习的差不多。RPC 走 String 序列化后的 byte[],但是 RPC 的序列化机制也不至于使用 Java 自带的机制吧,并且就算使用了那也是序列化 String,和 model 中的类无关。

@oneisall8955 和你对 Serialzable 同样的理解,看到代码中的 Serialzable,也恨不得一个个删掉

@idoggy 新项目,Java 后端 ssm 那一套,我想着也用不到 Serialzable 啊

smilekung:dubbo 的默认序列化应该是要实现的,刚工作的时候也经常忘

Java-通过套接字发送指向BufferedImage的对象 - java

我和一群朋友正在用Java开发项目,我们需要一些有关通过套接字发送对象的帮助。到目前为止,我们已经实现了使用ObjectOutputStream和ObjectInputStream通过套接字发送简单对象(int,字符串和诸如此类)的方法。但是,我们今天遇到了一个大问题(无论如何对我们来说都是巨大的^^)我们有一个树状结构,需要从一台PC发送到另一台PC。问题…

调用没有超类的super()吗? - java

当构造函数调用“super()”而没有Object之外没有任何超类时会发生什么(如果有的话)?像这样:public class foo implements Serializable, Comparable { int[] startPoint; public foo() { super(); startPoint = {5,9}; } } 编辑:那么,如果…

Java Swing的MVC模式 - java

我有一个使用MVC模式开发Java Swing应用程序的想法。我已经在下面描述了我的想法,请让我知道,这是对Java Swing使用MVC模式的正确方法吗?这是观点以下方法用于获取和设置以上视图的名称,//at top of the view its model and controller is defined as Model model = null;…

您可以在不映射到字符串的情况下收集(joining())吗? - java

我正在阅读实际使用的Java 8,作者说,如果您有一个覆盖toString方法的类,则在执行collect(joining())时无需将流映射到String。一个例子: public static void main(String... args) { List<Person> people = Arrays.asList( new Person…

为什么ArrayList实现Serializable? - java

我尝试使用JAXB序列化ArrayList并失败。这是因为elementData被标记为瞬态吗?为什么ArrayList实现可序列化接口并且其数据瞬态?我尝试序列化Serializables的ArrayList:JAXBElement<ArrayList> jaxbElement = new JAXBElement<ArrayList>…