在Android中,我们是否可以以共享偏好存储某个类的对象,并在以后检索该对象?
如果可能的话,怎么做呢?如果不可能,还有什么其他的可能性呢?
我知道序列化是一种选择,但我正在寻找使用共享首选项的可能性。
发布于 2011-03-24 19:20:32
发布于 2013-03-23 23:26:55
是的,我们可以使用Gson来做到这一点
从GitHub下载工作代码
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
为了保存
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject); // myObject - instance of MyObject
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
For get
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
Update1
可以从github.com/google/gson下载最新版本的GSON。
Update2
如果你使用的是Gradle/Android Studio,只需在build.gradle
依赖部分添加以下内容-
implementation 'com.google.code.gson:gson:2.6.2'
发布于 2012-05-02 05:38:40
我们可以使用Outputstream将我们的对象输出到内存中。并转换为字符串,然后以首选方式保存。例如:
mPrefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor ed = mPrefs.edit();
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutput;
try {
objectOutput = new ObjectOutputStream(arrayOutputStream);
objectOutput.writeObject(object);
byte[] data = arrayOutputStream.toByteArray();
objectOutput.close();
arrayOutputStream.close();
ByteArrayOutputStream out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
b64.write(data);
b64.close();
out.close();
ed.putString(key, new String(out.toByteArray()));
ed.commit();
} catch (IOException e) {
e.printStackTrace();
}
当我们需要从偏好中提取对象时。使用如下代码
byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
if (bytes.length == 0) {
return null;
}
ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
ObjectInputStream in;
in = new ObjectInputStream(base64InputStream);
MyObject myObject = (MyObject) in.readObject();
https://stackoverflow.com/questions/5418160
复制相似问题