Java model 对象必须实现 Serializable 吗?

2020-09-29 20:40:36 +08:00
 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

5662 次点击
所在节点    程序员
43 条回复
mightofcode
2020-09-29 20:51:49 +08:00
不一定
java 自己内嵌了很多机制,比如 Serializable,Serializable 不是必须的,没有 Serializable 你也一样写程序,甚至比 Serializable 做的更好

Serializable 不好用,java 自带的序列化也做的不行,这两个都建议别用了
mightofcode
2020-09-29 20:54:04 +08:00
你们应该有测试吧
业务能跑就说明没问题

你的同事有点僵硬
zsdroid
2020-09-29 20:55:20 +08:00
所以坑呢?
chenshun00
2020-09-29 21:02:13 +08:00
我寻思着 Serializable 接口也没被标明 @Deprecated 啊,你印象中的「此接口是需要逐渐废弃使用的」是如何得来的. :)

难道你们的 RPC 都走的是字符串. :)
sawyera
2020-09-29 21:02:46 +08:00
@mightofcode 我也认为测试业务能跑就说明没问题,但是同事用一个奇葩的理由反驳我:”一百次成功也说明不了问题,不实现 Serializable 的话,可能下次调用就失败了,到时候吐空数据给前端你能承担后果吗?“


@zsdroid 我让同事复现坑,同事复现不出来,说”之前好像使用 jackson 序列化不实现 Serialzable 的类会报错“,然后就别人的代码都这么写你也要这么写、承担后果之类的话
oneisall8955
2020-09-29 21:08:16 +08:00
学习这个接口的时候,Demo 是序列化到磁盘,课本中说还有一个作用是网络传输。很疑惑的是现在接口间都是 json 作为介质了吧。另外缓存到 redis 默认情况也是转 json 字符串到内存 value 的。
现在就职的公司代码生成器生成代码是实现了这个接口,我每次生成新代码都删掉了,觉得很碍地方。。。
以前公司也没见用
idoggy
2020-09-29 21:11:03 +08:00
落库的对象要序列化,这系统至少六年朝上了吧
billlee
2020-09-29 21:16:00 +08:00
需要考虑性能的地方都不用。Json/kryo/protobuf 哪个不比 serializable 好用
huifer
2020-09-29 21:17:50 +08:00
如果需要使用 ObjectOutputStream ObjectInputStream 那么必须实现. 如果说落入 DB , 这可以不需要. mybatis jpa 应该没有强制要求. 如果是 fastjson 或者其他 json 序列化通过这类工具反序列化和序列化都没有强制要求实现 Serializable 接口. redis 这类都提供了序列化方式的重写接口,通过这些重写可以替换掉原有的,即可以转换为 fastjson 等序列化工具.
ssynhtn
2020-09-29 21:18:17 +08:00
你的同事水平有点低啊
sawyera
2020-09-29 21:19:10 +08:00
@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
2020-09-29 21:23:57 +08:00
dubbo 的默认序列化应该是要实现的,刚工作的时候也经常忘
lxk11153
2020-09-29 22:07:28 +08:00
@smilekung #12 [233]换 serialization 就行了
@sawyera 不需要 [doge], 不要纠结这个,领导说写就写,反正又不麻烦,不管警告的话直接 parent 类实现下就行
youxiachai
2020-09-29 22:45:24 +08:00
万一要对接一个很老的序列化接口,不就能用上了..[doge]
BBCCBB
2020-09-29 23:01:36 +08:00
这个接口的确是有废弃的迹象. 也没啥用, 不用实现.
night98
2020-09-29 23:03:23 +08:00
有部分客户端在传输的时候需要这个东西,不过我个人是觉得加不加无所谓,真有问题了再加也不迟
nvkou
2020-09-29 23:05:47 +08:00
把这个问题抽象一下就是:上头要我写屎山还不接受反驳?
这个问题的答案是:如果你只是拧螺丝的就别怪图纸,有意见等自己也出图纸的时候。

在公司角度来看,工作人员是流动的,但生产事故是公司的。权责不统一的情况下听责任方
hhhsuan
2020-09-29 23:12:18 +08:00
让你写就写,别那么多废话,你吵了半天能给你加工资吗
Saurichthys
2020-09-29 23:37:42 +08:00
定义一个 basemodel 实现序列化,业务对象继承就好了,哪来事这么多需要每个都写一遍!?
wangyanrui
2020-09-30 00:03:47 +08:00
领导让写就写,除非你能推动大家都不写

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX