通常情况下SharedPreferences只用于存取基础数据类型或者String类型的键值对,但某些情况下需要存取一些复类型的对象,如集合对象,此时可以通过往SharedPreferences中存取对象的方式使用。
存时,把对象写入ByteArrayOutputStream中(外套ObjectOutputStream),然后将byte数组通过Base64编码为String结构,作为值存入。取时,把String通过Base64解码为byte数组,然后装入ByteArrayInputStream中(外套ObjectInputStream),转为申明过泛型的对象。
存对象:
public void putObject(String key, Object object) {
if(!TextUtils.isEmpty(key) && null != object) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
String objectVal = new String(android.util.Base64.encode(baos.toByteArray(), 0));
Editor editor = this.mPreferences.edit();
editor.putString(key, objectVal);
editor.apply();
} catch (IOException var15) {
SuningLog.e("putObject", var15);
} finally {
try {
if(baos != null) {
baos.close();
}
if(oos != null) {
oos.close();
}
} catch (IOException var14) {
SuningLog.e("putObject", var14);
}
}
}
}
取对象:
public T getObject<T>(String key) {
String objectVal = this.mPreferences.getString(key, (String)null);
if(TextUtils.isEmpty(objectVal)) {
return null;
} else {
byte[] buffer = android.util.Base64.decode(objectVal, 0);
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bais);
T t = ois.readObject();
Object var7 = t;
return var7;
} catch (StreamCorruptedException var21) {
SuningLog.e("getObject", var21);
} catch (IOException var22) {
SuningLog.e("getObject", var22);
} catch (ClassNotFoundException var23) {
SuningLog.e("getObject", var23);
} finally {
try {
if(bais != null) {
bais.close();
}
if(ois != null) {
ois.close();
}
} catch (IOException var20) {
SuningLog.e("getObject", var20);
}
}
return null;
}
}