【问题标题】:GSON deserializing generic typeGSON 反序列化泛型类型
【发布时间】:2013-01-28 18:35:37
【问题描述】:

我有以下课程,基本上是来自网络服务的响应。

public class WSGenericMessage<T> implements Serializable {

private static final long serialVersionUID = 1L;
private Boolean ResponseCode;
private String ResponseMessage;
private Class<T> ResponseData;

public Boolean getResponseCode() {
    return ResponseCode;
}

public void setResponseCode(Boolean responseCode) {
    ResponseCode = responseCode;
}

public String getResponseMessage() {
    return ResponseMessage;
}

public void setResponseMessage(String responseMessage) {
    ResponseMessage = responseMessage;
}

public Class<T> getResponseData() {
    return ResponseData;
}

public void setResponseData(Class<T> responseData) {
    ResponseData = responseData;
}

}

是否可以通过以下方式反序列化json字符串:

  Gson gson = new Gson();
  Type type = new TypeToken<WSGenericMessage<String>>(){}.getType();
  gson.fromJson(result, type);

我得到:

   java.lang.UnsupportedOperationException: Attempted to deserialize a java.lang.Class. Forgot to register a type adapter?

【问题讨论】:

    标签: java generics deserialization gson


    【解决方案1】:

    有类似类型擦除的东西,所以泛型类型被擦除并且在运行时不可用。

    因此,您可以在没有通用分类器的情况下反序列化对象给定类,而不是“强制转换”为正确的类型。

    但是你的问题不是泛型类型反序列化,而是包含java.lang.Class对象的类型。这不能序列化和反序列化。

    对于序列化和反序列化,您应该使用没有 Class 字段的对象,使用带有类名的 String 字段,或者将此字段标记为 transient 并在之后恢复它。

    【讨论】:

    • “这不能被序列化和反序列化” - 为什么不呢? Class 实现 Serializable。请澄清你的答案。
    • 对,我能猜到原因。我只是要求您澄清 OP 的“类型擦除”之外的原因。理解异常消息会很好。
    猜你喜欢
    • 2013-08-26
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多