首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Square的磁带库如何处理调用抽象类

使用Square的磁带库如何处理调用抽象类
EN

Stack Overflow用户
提问于 2014-07-09 04:14:11
回答 1查看 1K关注 0票数 2

我使用的是广场磁带库,我已经满足了一个需求,我基本上需要一个抽象的TapeTask类。但是,问题是GsonConverter的反序列化过程(它实现了库的FileObjectQueue.Converter --如样本工程所示)对接口/抽象类没有很好的作用。

我认为这是Gson反序列化问题,所以我用一个自定义TypeAdapter注册了Gson实例,但这仍然不能奏效。我想这和FileObjectQueue.Converter有关。

我目前正试图解决这个问题,我的子任务有一个令人讨厌的包装器回调接口。

我的要求是拥有一个TapeQueue,并且能够发送多个类型的任务。所以我有一个TapeTask抽象类,并且有一些具体的实现,比如ImageDownloadTask、ImageUploadTask、UrlPostWithRetrofitTask、GoogleAnalyticsTrackerTask .等等,都要排到一个队列里。

有没有办法做到这一点。我想我的问题归结为:,我需要做什么才能使FileObjectQueue.Converter更好地使用抽象类

提示:P :该类的javadoc表示"..you还需要在序列化的字节数组中包含具体的类名“,但我不知道这意味着什么。如果有人能够以一种达到我的目的的方式来解释如何将名称包含在序列化字节数组中,我将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2014-07-09 16:46:20

我写了一个抽象的Gson转换器。我不认为这是超高效的,但能完成任务:

代码语言:javascript
复制
/**
 * Use GSON to serialize classes to a bytes.
 *
 * This variant of {@link GsonConverter} works with anything you throw at it.
 * It is however important for Gson to be able to understand your inner complex objects/entities
 * Use an {@link InterfaceAdapter} for these purposes.
 *
 */
public class GsonAbstractClassConverter<T>
    implements FileObjectQueue.Converter<T> {

    public static final String CONCRETE_CLASS_NAME = "concrete_class_name";
    public static final String CONCRETE_CLASS_OBJECT = "concrete_class_object";
    private final Gson _gson;

    public GsonAbstractClassConverter(Gson gson) {
        _gson = gson;
    }

    @Override
    public T from(byte[] bytes) {
        Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes));
        JsonObject completeAbstractClassInfoAsJson = _gson.fromJson(reader, JsonObject.class);

        Class<T> clazz;
        try {
            String className = completeAbstractClassInfoAsJson.get(CONCRETE_CLASS_NAME).getAsString();
            clazz = (Class<T>) Class.forName(className);
        } catch (ClassNotFoundException e) {
            Timber.e(e, "Error while deserializing TapeTask to a concrete class");
            return null;
        }

        String objectDataAsString = completeAbstractClassInfoAsJson.get(CONCRETE_CLASS_OBJECT)
                                                                   .getAsString();

        return _gson.fromJson(objectDataAsString, clazz);
    }

    @Override
    public void toStream(T object, OutputStream bytes) throws IOException {
        Writer writer = new OutputStreamWriter(bytes);

        JsonObject completeAbstractClassInfoAsJson = new JsonObject();
        completeAbstractClassInfoAsJson.addProperty(CONCRETE_CLASS_NAME, object.getClass().getName());
        completeAbstractClassInfoAsJson.addProperty(CONCRETE_CLASS_OBJECT, _gson.toJson(object));

        _gson.toJson(completeAbstractClassInfoAsJson, writer);
        writer.close();
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24645299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档