Android保存List数据到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wb_001/article/details/83508180

一、在项目中是要将一个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;

    }
}

四、当然这里需要说明的一个问题是,我并没有说他们写错了,他们的写法没有问题,只不过可能是我们理解没有到位,本意可能是想封装一个方法,而是用了这个泛型的写法,实际使用是不能用这个泛型去封装的,是要具体到某个类。

猜你喜欢

转载自blog.csdn.net/wb_001/article/details/83508180