如何使通用类型可序列化?

时间:2016-08-31 21:25:20

标签: java generics serialization

SonarQube提供以下错误:

  

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

在以下课程中:

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

    private static final long serialVersionUID = 1L;

    private T type;
}

IAType是一个界面:

public interface IAType {

}

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

public enum OneIAType implements IAType, Serializable {

    GENERIC

}

该类用于REST接口,因此它应该是Serializable。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

将类型变量声明为intersection type

<T extends IAType & Serializable>

编辑:SonarQube似乎无法将此建议识别为可序列化类型。

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

<T extends Enum<T> & IAType>

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

事实证明这种方式有效,而第一种方式则不然:两种类型can be assigned to a variable of type Serializable的引用。 (也许这是SonarQube中的一个错误?)