如何使泛型类型可序列化?

Mar*_*ger 0 java generics serialization

SonarQube 给出了以下错误:

使“类型”瞬态或可序列化。

在以下课程中:

@XmlRootElement
public class InsuredAmount<T extends IAType> implements Serializable {

    private static final long serialVersionUID = 1L;

    private T type;
}
Run Code Online (Sandbox Code Playgroud)

IAType 是一个接口:

public interface IAType {

}
Run Code Online (Sandbox Code Playgroud)

使用各种枚举实现,例如:

public enum OneIAType implements IAType, Serializable {

    GENERIC

}
Run Code Online (Sandbox Code Playgroud)

该类用于 REST 接口,因此它应该是可序列化的。

我的问题: 1. 我不认为将类型标记为瞬态是一个好主意,因为我通过 REST 接口传输这个类。如果我将此类型标记为瞬态会导致问题吗?2. 如何使类型可序列化?

And*_*ner 5

  1. 如果我将此类型标记为瞬态会导致问题吗?

取决于您在反序列化实例后是否需要该字段中的值。如果这样做,您可以将其标记为transient,但您需要某种其他方式来传输必要的信息以type在远端重建 的值。

  1. 如何使类型可序列化?

将类型变量声明为交集类型

<T extends IAType & Serializable>
Run Code Online (Sandbox Code Playgroud)

编辑:看来这个建议不被 SonarQube 识别为可序列化的类型。

它在问题中说接口的实现是枚举;这表明表达界限的另一种方法是:

<T extends Enum<T> & IAType>
Run Code Online (Sandbox Code Playgroud)

请注意,所有枚举都是隐式可序列化的,因此Serializable不必显式位于交集类型中。

事实证明,这种方法有效,而第一种方法无效:两种类型的引用都可以分配给Serializable类型为 的变量。(也许这是 SonarQube 中的一个错误?)