无法使用Gson转换存储在SharedPreferences中的类数据

时间:2017-01-05 12:46:24

标签: android gson sharedpreferences

我在AppController.java中定义了一个广义静态函数,它实现了Application类。这个静态函数可以在共享首选项中存储和检索序列化类数据。

AppController.java

private static GsonBuilder gsonBuilder;
@Override
public void onCreate() {
    super.onCreate();
    gsonBuilder= new GsonBuilder();
}

public static void saveObjectToSharedPreferences(Context mContext,String key, Object value){
    if(mContext!=null){
        SharedPreferences mSharedPreferences=mContext.getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
        if(mSharedPreferences!=null) {
            Gson gson=gsonBuilder.excludeFieldsWithoutExposeAnnotation().create();
            String storableValue=gson.toJson(value,value.getClass());
            mSharedPreferences.edit().putString(key,storableValue).apply();
        }
    }
}

public static <T> Object readObjectFromSharedPreferences(Context mContext,String key, Class<T> converter ){
    if(mContext!=null){
        SharedPreferences mSharedPreferences = mContext.getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        if(mSharedPreferences!=null){
            Gson gson=gsonBuilder.excludeFieldsWithoutExposeAnnotation().create();
            String retrievedValue=mSharedPreferences.getString(key,null);
            if(retrievedValue!=null){
                return gson.fromJson(retrievedValue,converter.getClass());
            }
        }
    }
    return null;
}

我以前称这个静态函数如下:

AppController.saveObjectToSharedPreferences(getContext(), String.valueOf("UserData"), userDetailsObj);

我的UserDetails课程如下:

public class UserDetails implements Serializable{
    @Expose
    private String Name;
    @Expose
    private String UserGroup;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getUserGroup() {
        return UserGroup;
    }

    public void setUserGroup(String userGroup) {
        UserGroup = userGroup;
    }
}

saveObjectToSharedPreferences已成功将userdetails对象以[{1}}格式保存到SharedPreferences,但我正在尝试反序列化java.lang.Class。忘记注册类型适配器?,当我尝试使用{'Name':'somename','UserGroup':'somegroup'}行中的readObjectFromSharedPreferences函数检索它时。当我一直在搜索这个问题时,我知道我们需要专门为gson.fromJson编写TypeAdapter并在 this answer here 的帮助下实施所述适配器并在class gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory());期间写了onCreate

AppController class

现在我开始收到public class ClassTypeAdapterFactory implements TypeAdapterFactory { @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { if(!Class.class.isAssignableFrom(typeToken.getRawType())) { return null; } return (TypeAdapter<T>) new ClassTypeAdapter(); } } 并在详细消息Method threw 'com.google.gson.JsonSyntaxException' exception.下。

此时我完全是空白。有人可以指导我走正确的道路吗?

1 个答案:

答案 0 :(得分:1)

readObjectFromSharedPreferences中,您正在通过Class<T> converter,当您致电converter.getClass()时,它会返回Class而非T。只需删除getClass()这样的电话:

return gson.fromJson(retrievedValue, converter);

此外,改进此方法的一个好方法是让它返回T而不是Object。这样你就不必投出任何东西:

public static <T> T readObjectFromSharedPreferences(...)