SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常

Posted 怀化纱厂球迷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常相关的知识,希望对你有一定的参考价值。

最近有阵子没写博客了,跳槽了,转了个方向,是我之前一直想去的领域,我也准备了好一阵子,找这个方向的工作,运气不错,遇到了好的老大,这几天计划了下,今年后续计划,从2方面出发,一方面记录日常遇到问题,一方面梳理源码

今天帖子内容说下遇到的,大概说下场景,需要讲一个List <Bean > 保存在本地用SP,网上搜到很多帖子,本来是想找个不用GSON的,但是实在是没找到,应为是在SystemUI层改,后面没办法,我在 android.bp 文件里面加入了
 

java_import 
 
    name: "core-settings",
 
    jars: ["libs/core.jar"],
 
    sdk_version: "current",
 

 

继续说,网上找到的方法类

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 <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();
 
	
 
 
    /**
     * 获取List
     * @param tag
     * @return
     */
   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数据过程中,运行充抛出这样的问题异常的,简单来说就是在类中带有泛型时,gson无法识别其中的泛型而转成了LinkenTreeMap的类型。

解决办法就是:在使用泛型过程中,必须要具体到某一个类,不用使用泛型代替。

吧上面的T 改成你要用的bean 就能解决


 

以上是关于SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 SharedPreferences 保存字符串

如何使用 SharedPreferences 从 Flutter 中的列表中保存多个布尔值

SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常

SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常

SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常

SharedPreferences 保存List<Bean> 到本地并解决com.google.gson.internal.LinkedTreeMap cannot be cast to异常