当前位置:   article > 正文

Android SharedPreferences保存和读取对象_安卓开发 保存、读取 对象

安卓开发 保存、读取 对象

SharedPreferences保存和读取对象

1.首先要序列化对象(下面是序列化实体类的例子,不方便贴出实体类所有的代码)

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

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

  1. public class ObjectSaveUtil {
  2. private final static String FILENAME = "login_data_save";
  3. private final static String KEY = "loginResult";
  4. /**
  5. * desc:保存对象
  6. * @param context
  7. * @param key
  8. * @param obj 要保存的对象,只能保存实现了serializable的对象
  9. * modified:
  10. */
  11. public static void saveObject(Context context,Object obj){
  12. try {
  13. // 保存对象
  14. SharedPreferences.Editor sharedata = context.getSharedPreferences(FILENAME, 0).edit();
  15. //先将序列化结果写到byte缓存中,其实就分配一个内存空间
  16. ByteArrayOutputStream bos=new ByteArrayOutputStream();
  17. ObjectOutputStream os=new ObjectOutputStream(bos);
  18. //将对象序列化写入byte缓存
  19. os.writeObject(obj);
  20. //将序列化的数据转为16进制保存
  21. String bytesToHexString = bytesToHexString(bos.toByteArray());
  22. //保存该16进制数组
  23. sharedata.putString(KEY, bytesToHexString);
  24. sharedata.commit();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. Log.e("", "保存obj失败");
  28. }
  29. }
  30. /**
  31. * desc:将数组转为16进制
  32. * @param bArray
  33. * @return
  34. * modified:
  35. */
  36. public static String bytesToHexString(byte[] bArray) {
  37. if(bArray == null){
  38. return null;
  39. }
  40. if(bArray.length == 0){
  41. return "";
  42. }
  43. StringBuffer sb = new StringBuffer(bArray.length);
  44. String sTemp;
  45. for (int i = 0; i < bArray.length; i++) {
  46. sTemp = Integer.toHexString(0xFF & bArray[i]);
  47. if (sTemp.length() < 2)
  48. sb.append(0);
  49. sb.append(sTemp.toUpperCase());
  50. }
  51. return sb.toString();
  52. }
  53. /**
  54. * desc:获取保存的Object对象
  55. * @param context
  56. * @param key
  57. * @return
  58. * modified:
  59. */
  60. public static Object readObject(Context context){
  61. try {
  62. SharedPreferences sharedata = context.getSharedPreferences(FILENAME, 0);
  63. if (sharedata.contains(KEY)) {
  64. String string = sharedata.getString(KEY, "");
  65. if(TextUtils.isEmpty(string)){
  66. return null;
  67. }else{
  68. //将16进制的数据转为数组,准备反序列化
  69. byte[] stringToBytes = StringToBytes(string);
  70. ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);
  71. ObjectInputStream is=new ObjectInputStream(bis);
  72. //返回反序列化得到的对象
  73. Object readObject = is.readObject();
  74. return readObject;
  75. }
  76. }
  77. } catch (StreamCorruptedException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. } catch (IOException e) {
  81. // TODO Auto-generated catch block
  82. e.printStackTrace();
  83. } catch (ClassNotFoundException e) {
  84. // TODO Auto-generated catch block
  85. e.printStackTrace();
  86. }
  87. //所有异常返回null
  88. return null;
  89. }
  90. /**
  91. * desc:将16进制的数据转为数组
  92. * <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p>
  93. * @param data
  94. * @return
  95. * modified:
  96. */
  97. public static byte[] StringToBytes(String data){
  98. String hexString=data.toUpperCase().trim();
  99. if (hexString.length()%2!=0) {
  100. return null;
  101. }
  102. byte[] retData=new byte[hexString.length()/2];
  103. for(int i=0;i<hexString.length();i++)
  104. {
  105. int int_ch; // 两位16进制数转化后的10进制数
  106. char hex_char1 = hexString.charAt(i); 两位16进制数中的第一位(高位*16)
  107. int int_ch3;
  108. if(hex_char1 >= '0' && hex_char1 <='9')
  109. int_ch3 = (hex_char1-48)*16; 0 的Ascll - 48
  110. else if(hex_char1 >= 'A' && hex_char1 <='F')
  111. int_ch3 = (hex_char1-55)*16; A 的Ascll - 65
  112. else
  113. return null;
  114. i++;
  115. char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)
  116. int int_ch4;
  117. if(hex_char2 >= '0' && hex_char2 <='9')
  118. int_ch4 = (hex_char2-48); 0 的Ascll - 48
  119. else if(hex_char2 >= 'A' && hex_char2 <='F')
  120. int_ch4 = hex_char2-55; A 的Ascll - 65
  121. else
  122. return null;
  123. int_ch = int_ch3+int_ch4;
  124. retData[i/2]=(byte) int_ch;//将转化后的数放入Byte里
  125. }
  126. return retData;
  127. }
  128. }

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


本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号