2017-01-09 2 views
3

В моем приложении я использую ActiveAndoid.
В некоторых моделях у меня есть столбец List<String> и в других List<MyEnum>.
Я создал TypeSerializer для каждого типа:
ActiveAndroid 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 - не может отличить String до Enum.
Как решить эту проблему?

ответ

2

подход, который я использовал, чтобы выяснить различные типы

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

Надеюсь, это поможет вам решить вашу проблему.

Смежные вопросы