java - ActiveAndroid TypeSerializer - 枚举列表

标签 java android enums activeandroid

在我的应用程序中,我使用 ActiveAndoid .
在某些模型中,我有一列 List<String>和其他List<MyEnum> .
我创建了一个 TypeSerializer对于每种类型:

public class StringsListTypeSerializer extends TypeSerializer
{
    private static GsonBuilder sGsonBuilder;

    static{
        sGsonBuilder = new GsonBuilder();
    }

    @Override
    public Class<?> getDeserializedType() {
        return List.class;
    }

    @Override
    public Class<?> getSerializedType() {
        return String.class;
    }

    @Override
    public String serialize(Object data) {
        if(data == null){
            return null;
        }

        final Gson gson = sGsonBuilder.create();
        return gson.toJson(data);
    }

    @Override
    public List<String> deserialize(Object data) {
        if(data == null){
            return null;
        }

        final Gson gson = sGsonBuilder.create();
        List<String> strings = gson.fromJson(data.toString(), List.class);

        return strings;
    }
}

MyEnum (这是一个 enum 类型):

public class MyEnumListTypeSerializer extends TypeSerializer {

    private static GsonBuilder sGsonBuilder;

    static{
        sGsonBuilder = new GsonBuilder();
        sGsonBuilder.registerTypeAdapter(MyEnum.class, new MyEnumJsonDeserializer());
    }

    @Override
    public Class<?> getDeserializedType() {
        return new TypeToken<ArrayList<MyEnum>>(){}.getType().getClass();
    }

    @Override
    public Class<?> getSerializedType() {
        return String.class;
    }

    @Override
    public String serialize(Object data) {
        if(data == null){
            return null;
        }

        final Gson gson = sGsonBuilder.create();

        return gson.toJson(data);
    }

    @Override
    public ArrayList<MyEnum> deserialize(Object data) {
        if(data == null){
            return null;
        }

        final Gson gson = sGsonBuilder.create();
        Type listType = new TypeToken<ArrayList<MyEnum>>(){}.getType();
        ArrayList<MyEnum> myList = gson.fromJson(data.toString(), listType);

        return myList;
    }
}

我的问题是 ActiveAndroid序列化 MyEnum列表类型作为字符串列表(使用 StringsListTypeSerializer )和运行时当我使用 List<MyEnum> 时在每个循环中我得到 ClassCastException - 无法转换 StringEnum .
如何解决这个问题?

最佳答案

我用来找出不同类型的方法

public abstract class BaseGsonSerializer extends TypeSerializer {

    private Gson gson;

    public BaseGsonSerializer() {
        this.gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    }

    @DebugLog
    @Override
    public Class<?> getSerializedType() {
        return String.class;
    }

    @Override
    @DebugLog
    public Class<?> getDeserializedType() {
        return TypeToken.get(getTypeDeserialize()).getRawType();
    }

    @Override
    public Object serialize(Object data) {
        if (data != null) {
            return gson.toJson(data);
        }
        return null;
    }

    @Override
    public Object deserialize(Object data) {
        if (data != null) {
            return gson.fromJson(data.toString(), getTypeDeserialize());
        }
        return null;
    }

    protected abstract Type getTypeDeserialize();

}

以下类使用 BaseGsonSerializer

public class PriceSerializer extends BaseGsonSerializer {

    protected Type getTypeDeserialize() {
        return new TypeToken<Price>() {
        }.getType();
    }
}

public class PriceListSerializer extends BaseGsonSerializer {

    protected Type getTypeDeserialize() {
        return new TypeToken<List<Price>>() {
        }.getType();
    }
}

这正是我想要的,即转换为 json 字符串的价格列表和转换为 json 字符串的价格对象

希望这可以帮助您解决问题。

关于java - ActiveAndroid TypeSerializer - 枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543740/

相关文章:

java - 获取 YouTube 视频的交互式脚本

java - 开始使用 wicket 和 Hibernate

android - 如何关闭 Android >= 3.0 中带有附加按钮的自定义丰富通知中的通知下拉列表?

c# - 为什么一个枚举可以有两个不同的名字和相同的数值?

java - 从页面中的 Xpath 获取数据 - java

java - 计算字符串中连续重复出现的字符数

android - flutter build apk重复安装platform-tools

android - Listitem 点击不适用于复选框 Android

c++ - 自定义枚举基础类型

java - 枚举中具有字符串值的 int 值