2013-01-28 3 views
1

기본적으로 웹 서비스에서 응답하는 다음 클래스가 있습니다.GSON을 일반화 된 형식으로 역 직렬화

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? 

답변

1

유형의 삭제 같은, 그래서 일반적인 유형이 삭제되고있어

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 문자열을 역 직렬화 할 수 있나요 런타임에는 사용할 수 없습니다.

그래서 일반 분류 자없이 클래스 제공 객체를 직렬화 해제 할 수 있고 적절한 유형으로 '형변환'할 수 있습니다.

그러나 문제는 제네릭 형식의 역 직렬화가 아니라 java.lang.Class 개체를 포함하는 형식입니다. 직렬화 및 직렬화 할 수 없습니다.

직렬화 및 직렬화 해제의 경우 클래스 필드없이 객체를 사용해야하며 클래스 이름과 함께 문자열 필드를 사용하거나이 필드를 transient으로 표시하고 나중에 복원해야합니다.

+0

"직렬화 및 직렬화 할 수 없습니다."- 왜 안 되니? 'Class'는'Serializable'을 구현합니다. 당신의 대답을 분명히하십시오. –

+1

GSON이 처리 할 수 ​​없습니다. –

+4

맞아, 왜 그런지 짐작할 수있다. 나는 그저 OP를위한 "타입 소거"이상의 이유를 분명히 해줄 것을 요구하고 있습니다. 예외 메시지를 이해하는 것이 좋을 것입니다. –