使用泛型用于使用gson进行反序列化

时间:2014-12-11 15:23:39

标签: android json generics serialization gson

我有一个非常具体的问题,用于通过gson反序列化泛型。 我使用square otto和tape的组合来排队我用于请求的所有事件。 因此,我使用带有枚举的通用加载数据事件来知道要发送的请求:

public class GenericLoadDataEvent<T> {
    private LoadDataEnum mDataEnum;
    T mRequestData;

    public GenericLoadDataEvent(LoadDataEnum dataEnum, T requestData) {
        mDataEnum = dataEnum;
        this.mRequestData = requestData;
    }

    {...}
}

和要序列化的数据保持类:

public class ServerTask implements Task<ServerTask.ServerTaskCallback>  {
   public static final String TAG = ServerTask.class.getSimpleName();

   private LoadDataEnum mDataEnum;
   private GenericLoadDataEvent mGenericLoadDataEvent;

   public ServerTask(GenericLoadDataEvent event) {
       mGenericLoadDataEvent = event;
       mDataEnum = event.getDataEnum();
   }

   {...}

}

序列化到磁带工作得很好但是当我用gson反序列化磁带条目时我总是得到一个com.google.gson.internal.LinkedTreeMap而不是GenericLoadDataEvent中的Object,因为Gson不要知道要用于T requestData Object的类。

我使用GsonConverter进行序列化和反序列化,其中T是ServerTask,在这种情况下:

public class GsonConverter<T> implements FileObjectQueue.Converter<T> {

private final Gson gson;
private final Class<T> type;

public GsonConverter(Gson gson, Class<T> type) {
    this.gson = gson;
    this.type = type;
}


/**
 * Converts bytes to an object.
 *
 * @param bytes
 */
@Override
public T from(byte[] bytes) throws IOException {
    Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes));
    return gson.fromJson(reader, type);
}

我现在的问题是 - 如何告诉gson GenericLoadDataEvent中的T mRequestData应该是哪个类?

我尝试过类似的事情:

public class ServerTask<T> implements Task<ServerTask.ServerTaskCallback> {
public static final String TAG = ServerTask.class.getSimpleName();

private LoadDataEnum mDataEnum;
private GenericLoadDataEvent<T> mGenericLoadDataEvent;

public ServerTask(GenericLoadDataEvent event) {
    mGenericLoadDataEvent = event;
    mDataEnum = event.getDataEnum();
}

但那不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

本教程将有所帮助。他们为泛型添加了一个类型名称。 http://www.studytrails.com/java/json/java-google-json-serializing-classes-with-generic-type.jsp