赞
踩
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;
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。