我在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.
下。
此时我完全是空白。有人可以指导我走正确的道路吗?
答案 0 :(得分:1)
在readObjectFromSharedPreferences
中,您正在通过Class<T> converter
,当您致电converter.getClass()
时,它会返回Class
而非T
。只需删除getClass()
这样的电话:
return gson.fromJson(retrievedValue, converter);
此外,改进此方法的一个好方法是让它返回T
而不是Object
。这样你就不必投出任何东西:
public static <T> T readObjectFromSharedPreferences(...)