版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、在项目中是要将一个List对象保存到本地,在很多博客上有这个解决方法:保存到SharedPreferences中,我们知道SharedPreferences只能保存基本数据类型,我们要保存List对象的时候,需要将List转化成json数据,在保存。
二、网络上的方法:
1、保存方法:
public <T> void setDataList(String tag, List<T> datalist) {
if (null == datalist || datalist.size() <= 0)
return;
Gson gson = new Gson();
//转换成json数据,再保存
String strJson = gson.toJson(datalist);
editor.clear();
editor.putString(tag, strJson);
editor.commit();
}
2、取出方法为:
public <T> List<T> getDataList(String tag) {
List<T> datalist=new ArrayList<T>();
String strJson = preferences.getString(tag, null);
if (null == strJson) {
return datalist;
}
Gson gson = new Gson();
datalist = gson.fromJson(strJson, new TypeToken<List<T>>() {
}.getType());
return datalist;
}
而实际在运行上述代码中如果这样写是会抛异常的:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to…
抛出这种异常的原因就是因为取出的时候使用Gson解析Json数据过程中,运行充抛出这样的问题异常的!!!
解决办法就是:在使用泛型过程中,必须要具体到某一个类,不用使用泛型代替。
三,比如你需要对List < StockAdd > 这样一个list保存到本地,那么写法是:
public class ListDataSave {
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
public ListDataSave(Context mContext) {
preferences = mContext.getSharedPreferences("stock_info", Context.MODE_PRIVATE);
editor = preferences.edit();
}
/**
* 保存List
* @param tag
* @param datalist
*/
public void setDataList(String tag, List<StockAdd> datalist) {
if (null == datalist)
return;
Gson gson = new Gson();
//转换成json数据,再保存
String strJson = gson.toJson(datalist);
editor.clear();
editor.putString(tag, strJson);
editor.commit();
}
/**
* 获取List
* @param tag
* @return
*/
public List<StockAdd> getDataList(String tag) {
List<StockAdd> datalist=new ArrayList<StockAdd>();
String strJson = preferences.getString(tag, null);
if (null == strJson) {
return datalist;
}
Gson gson = new Gson();
datalist = gson.fromJson(strJson, new TypeToken<List<StockAdd>>() {
}.getType());
return datalist;
}
}
四、当然这里需要说明的一个问题是,我并没有说他们写错了,他们的写法没有问题,只不过可能是我们理解没有到位,本意可能是想封装一个方法,而是用了这个泛型的写法,实际使用是不能用这个泛型去封装的,是要具体到某个类。