【发布时间】:2014-12-11 15:23:39
【问题描述】:
我有一个关于使用 gson 反序列化泛型的非常具体的问题。 我正在使用方形 otto 和磁带的组合来排队我用于请求的所有事件。 因此,我使用带有枚举的通用加载数据事件来知道要发送哪个请求:
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 对象。
我正在使用 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();
}
但这不起作用。
有什么想法吗?
【问题讨论】:
标签: android json generics serialization gson