• Android SharedPreferences保存和读取对象


    SharedPreferences保存和读取对象

    1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码)

    public class LoginResult extends BaseResult implements Serializable{
    
    	private static final long serialVersionUID = 1L;
    	
    	private String mobiletoken;

    2.保存和读取对象的封装

    public class ObjectSaveUtil {
    	
    	private final static String FILENAME = "login_data_save";
    	
    	private final static String KEY = "loginResult";
    	
    	  /**
    	   * desc:保存对象	 
    	   * @param context
    	   * @param key 
    	   * @param obj 要保存的对象,仅仅能保存实现了serializable的对象
    	   * modified:	
    	   */
    	  public static void saveObject(Context context,Object obj){
    	      try {
    	          // 保存对象
    	          SharedPreferences.Editor sharedata = context.getSharedPreferences(FILENAME, 0).edit();
    	          //先将序列化结果写到byte缓存中,事实上就分配一个内存空间
    	          ByteArrayOutputStream bos=new ByteArrayOutputStream();
    	          ObjectOutputStream os=new ObjectOutputStream(bos);
    	          //将对象序列化写入byte缓存
    	          os.writeObject(obj);
    	          //将序列化的数据转为16进制保存
    	          String bytesToHexString = bytesToHexString(bos.toByteArray());
    	          //保存该16进制数组
    	          sharedata.putString(KEY, bytesToHexString);
    	          sharedata.commit();
    	      } catch (IOException e) {
    	          e.printStackTrace();
    	          Log.e("", "保存obj失败");
    	      }
    	  }
    	  /**
    	   * desc:将数组转为16进制
    	   * @param bArray
    	   * @return
    	   * modified:	
    	   */
    	  public static String bytesToHexString(byte[] bArray) {
    	      if(bArray == null){
    	          return null;
    	      }
    	      if(bArray.length == 0){
    	          return "";
    	      }
    	      StringBuffer sb = new StringBuffer(bArray.length);
    	      String sTemp;
    	      for (int i = 0; i < bArray.length; i++) {
    	          sTemp = Integer.toHexString(0xFF & bArray[i]);
    	          if (sTemp.length() < 2)
    	              sb.append(0);
    	          sb.append(sTemp.toUpperCase());
    	      }
    	      return sb.toString();
    	  }
    	  /**
    	   * desc:获取保存的Object对象
    	   * @param context
    	   * @param key
    	   * @return
    	   * modified:	
    	   */
    	  public static Object readObject(Context context){
    	      try {
    	          SharedPreferences sharedata = context.getSharedPreferences(FILENAME, 0);
    	          if (sharedata.contains(KEY)) {
    	               String string = sharedata.getString(KEY, "");
    	               if(TextUtils.isEmpty(string)){
    	                   return null;
    	               }else{
    	                   //将16进制的数据转为数组。准备反序列化
    	                   byte[] stringToBytes = StringToBytes(string);
    	                     ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);
    	                     ObjectInputStream is=new ObjectInputStream(bis);
    	                     //返回反序列化得到的对象
    	                     Object readObject = is.readObject();
    	                     return readObject;
    	               }
    	          }
    	      } catch (StreamCorruptedException e) {
    	          // TODO Auto-generated catch block
    	          e.printStackTrace();
    	      } catch (IOException e) {
    	          // TODO Auto-generated catch block
    	          e.printStackTrace();
    	      } catch (ClassNotFoundException e) {
    	          // TODO Auto-generated catch block
    	          e.printStackTrace();
    	      }
    	      //全部异常返回null
    	      return null;
    	      
    	  }
    	  /**
    	   * desc:将16进制的数据转为数组
    	   * <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p>
    	   * @param data
    	   * @return
    	   * modified:	
    	   */
    	  public static byte[] StringToBytes(String data){
    	      String hexString=data.toUpperCase().trim();
    	      if (hexString.length()%2!=0) {
    	          return null;
    	      }
    	      byte[] retData=new byte[hexString.length()/2];
    	      for(int i=0;i<hexString.length();i++)
    	      {
    	          int int_ch;  // 两位16进制数转化后的10进制数
    	          char hex_char1 = hexString.charAt(i); ////两位16进制数中的第一位(高位*16)
    	          int int_ch3;
    	          if(hex_char1 >= '0' && hex_char1 <='9')
    	              int_ch3 = (hex_char1-48)*16;   //// 0 的Ascll - 48
    	          else if(hex_char1 >= 'A' && hex_char1 <='F')
    	              int_ch3 = (hex_char1-55)*16; //// A 的Ascll - 65
    	          else
    	              return null;
    	          i++;
    	          char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)
    	          int int_ch4;
    	          if(hex_char2 >= '0' && hex_char2 <='9')
    	              int_ch4 = (hex_char2-48); //// 0 的Ascll - 48
    	          else if(hex_char2 >= 'A' && hex_char2 <='F')
    	              int_ch4 = hex_char2-55; //// A 的Ascll - 65
    	          else
    	              return null;
    	          int_ch = int_ch3+int_ch4;
    	          retData[i/2]=(byte) int_ch;//将转化后的数放入Byte里
    	      }
    	      return retData;
    	}
    	
    }

    挺好用的,欢迎大家复制使用


  • 相关阅读:
    上周热点回顾(6.5-6.11)团队
    云计算之路-阿里云上:14:20-14:55博客后台2台服务器都CPU 100%引发的故障团队
    牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
    牛客网Java刷题知识点之equals和hashcode()
    spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)
    大数据的结构类型(结构化数据、半结构化数据、准结构化数据、非结构化数据)
    Spark 1.6.2 + Beam 2.0.0读取Mongodb数据进行相应逻辑处理
    Docker的基本概念
    Docker的基本构架
    Docker概念学习系列之Docker是什么?(1)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7340967.html
Copyright © 2020-2023  润新知