Java未实现Serializable的自定义类可JSON序列化?Sonar警告需处理吗?
关于Java序列化与Sonar警告的答疑
咱们先把核心问题拆成两部分说清楚:
为什么未实现Serializable的自定义类能被序列化?
你得先搞懂Java原生序列化和JSON序列化是完全两码事:
- 前者是JDK自带的机制,用
ObjectOutputStream把对象转成字节流,要求所有非transient的字段必须实现Serializable,不然序列化时直接抛NotSerializableException; - 后者是Jackson、Gson这类第三方库的玩法,靠反射读对象的字段或者getter方法,把属性转成JSON字符串,根本不关心
Serializable接口。你说的自定义类能转JSON,就是这个机制在工作,和Java原生序列化半毛钱关系没有。
Sonar的警告是盯着Java原生序列化场景的,而你实际用的是JSON序列化,所以才会出现“警告和实际情况对不上”的情况。
能不能忽略这个Sonar警告?
这得看你的代码实际会被怎么用:
- 如果这个类只会用来做JSON序列化(比如作为接口的请求/响应DTO,只和JSON库打交道),那Java原生序列化的逻辑根本不会触发,这个警告就是误判,完全可以忽略。嫌烦的话,还能在Sonar的规则配置里给这个类加个排除,以后就不会弹这个警告了。
- 如果这个类有可能被用到Java原生序列化场景(比如要存到Redis、HttpSession里,或者用
ObjectOutputStream写文件/网络流),那这个警告绝对不能无视:- 要么让你的自定义类实现
Serializable接口(如果原生序列化需要保留这个类的内容); - 要么把这个字段标成
transient(如果原生序列化不需要这个字段的值)。
- 要么让你的自定义类实现
内容的提问来源于stack exchange,提问作者Kranthi
相关产品推荐
相关产品推荐

