【问题标题】:Use generic for deserializing with gson使用泛型与 gson 进行反序列化
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2014-11-29
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多