Sonar java:1948 “Make transient or serializable“ error解决

问题原因:

        当一个类实现了java.io.Serializable接口时,它的实例可以被序列化。Serializable接口是一个标记接口,它本身不包含任何方法。它的作用是告诉Java虚拟机(JVM)这个类的对象可以被序列化。默认情况下,类中所有的非transient(非瞬态)和非static(非静态)字段都会被序列化。

        transient关键字用于声明一个实例变量,这个变量不应被序列化。当对象的某个字段被声明为transient时,这个字段将不会被序列化到文件中,也不会从文件中反序列化回来。这通常用于敏感信息(如密码)或不需要持久化的字段。

       序列化:当你需要将对象的状态信息保存到文件、数据库或通过网络传输时,就需要将对象序列化。例如,在网络应用中,对象的序列化可以用来实现远程过程调用(RPC、dubbo调用等)。

        Transient关键字:当你希望对象的某些部分(如敏感信息或可以重新计算的信息)不被序列化时,就可以使用transient关键字。例如,用户的密码在保存到数据库时可能不应该明文存储,而可以标记为transient

注意点

  • 当实现Serializable接口时,建议显式定义一个serialVersionUID,这个版本号用于序列化时的版本控制。如果不定义,JVM会根据类的细节自动生成一个,如果类的定义发生了改变(如添加/删除字段),但序列化版本号没有改变,可能会导致反序列化时抛出InvalidClassException
  • 序列化的安全性也是一个重要问题,特别是当序列化数据来自不受信任的来源时。反序列化恶意构造的数据可能会执行恶意代码。因此,在处理反序列化时要格外小心。

使用SonarLint对代码进行检查时,会出现如下issue.

举例:当对象出现如下代码时,会检测出此问题

private List<T> list;
private T content;
private Object result;
private TTransport outputTransport

解决方案就是,在类中增加如下代码

 private void writeObject(java.io.ObjectOutputStream stream)
        throws IOException {
    stream.defaultWriteObject();
}

private void readObject(java.io.ObjectInputStream stream)
        throws IOException, ClassNotFoundException {
    stream.defaultReadObject();
}

参考地址:https://stackoverflow.com/questions/59252823/sonar-make-transient-or-serializable-error

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值