2017-01-09 65 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 - 不能投StringEnum
如何解决这个问题?

回答

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字符串

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