我知道SharedPreferences有putString()
,putFloat()
,putLong()
,putInt()
和putBoolean()
。但我需要在SharedPreferences
中存儲Serializable
類型的對象。我怎樣才能做到這一點?Android - 帶有可序列化對象的SharedPreferences
37
A
回答
42
總之你不能,試試你的序列化對象的私有文件,它相當於同樣的事情。下面的示例類:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.app.Activity;
import android.content.Context;
/**
*
* Writes/reads an object to/from a private local file
*
*
*/
public class LocalPersistence {
/**
*
* @param context
* @param object
* @param filename
*/
public static void witeObjectToFile(Context context, Object object, String filename) {
ObjectOutputStream objectOut = null;
try {
FileOutputStream fileOut = context.openFileOutput(filename, Activity.MODE_PRIVATE);
objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(object);
fileOut.getFD().sync();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOut != null) {
try {
objectOut.close();
} catch (IOException e) {
// do nowt
}
}
}
}
/**
*
* @param context
* @param filename
* @return
*/
public static Object readObjectFromFile(Context context, String filename) {
ObjectInputStream objectIn = null;
Object object = null;
try {
FileInputStream fileIn = context.getApplicationContext().openFileInput(filename);
objectIn = new ObjectInputStream(fileIn);
object = objectIn.readObject();
} catch (FileNotFoundException e) {
// Do nothing
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (objectIn != null) {
try {
objectIn.close();
} catch (IOException e) {
// do nowt
}
}
}
return object;
}
}
18
如果對象是簡單的POJO,你可以對象轉換爲JSON字符串,並將其與putString保存在共享偏好()。
12
這是可能做到這一點沒有文件。
我序列化信息的base64像這樣我可以把它保存爲喜好的字符串。
以下代碼將序列化對象序列化爲base64字符串,反之亦然: import android.util.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectSerializerHelper {
static public String objectToString(Serializable object) {
String encoded = null;
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(object);
objectOutputStream.close();
encoded = new String(Base64.encodeToString(byteArrayOutputStream.toByteArray(),0));
} catch (IOException e) {
e.printStackTrace();
}
return encoded;
}
@SuppressWarnings("unchecked")
static public Serializable stringToObject(String string){
byte[] bytes = Base64.decode(string,0);
Serializable object = null;
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
object = (Serializable)objectInputStream.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return object;
}
}
14
接受的答案是誤導,我們可以使用GSON將可序列化對象存儲到SharedPreferences中。在google-gson閱讀更多關於它的信息。
您可以添加GSON依賴於搖籃與文件:
compile 'com.google.code.gson:gson:2.7'
這裏的片段:
首先,創建你平時sharedPreferences:
//Creating a shared preference
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
保存從序列化對象的偏好:
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(YourSerializableObject);
prefsEditor.putString("SerializableObject", json);
prefsEditor.commit();
獲取序列化對象的偏好:
Gson gson = new Gson();
String json = mPrefs.getString("SerializableObject", "");
yourSerializableObject = gson.fromJson(json, YourSerializableObject.class);
相關問題
- 1. 將可序列化的對象列表保存到sharedPreferences中
- 2. 帶有對象列表的對象的PHP序列化
- 3. 帶有MarshalByRefObject字段的可序列化對象
- 4. 序列化具有不可序列化父類的對象
- 5. Android XML對象序列化
- 6. 帶輸出流的序列化對象
- 7. Java可序列化對象
- 8. 對象不可序列化
- 9. c# - 帶有序列化對象鍵的對象作爲對象的一部分
- 10. 帶SharedPreferences的空對象引用
- 11. 可能序列化一個不可序列化的對象?
- 12. 可序列化對象的組合是否也可序列化?
- 13. SharedPreferences用於序列化?
- 14. 正確反序列化帶有反序列化器的對象與傑克遜
- 15. 反序列化帶有泛型的複雜對象列表對象C#
- 16. 單聲道,帶MarshalByRefObject的可序列化對象
- 17. 帶有協程的可序列化類?
- 18. 帶有不可序列化部分的PHP序列化
- 19. 帶有序列號的Java對象
- 20. IllegalAccessException - 繼承不可序列化的對象的序列化
- 21. 序列化Android上的Drawable對象
- 22. Android上任意對象的序列化
- 23. 帶有對象輸入/輸出流的Java序列化
- 24. 在字典中反序列化帶有數組的JSON對象
- 25. 可序列化的ObjecOutputStream對象
- 26. 轉換爲可序列化的對象
- 27. 序列化和不可變的對象
- 28. 可序列化的對象屬性
- 29. 可序列化對象上的InvalidClassException
- 30. 緩存不可序列化的對象
應該'filename'在你的代碼是絕對路徑(如:「/data/com.example.myapp/foobar.dat」),或者它應該是相對的(例如:「foobar.dat」)? – 2011-08-30 22:21:27
只是一個文件名,路徑分隔符是不允許的,因爲在API文檔http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,詮釋說明) – 2011-08-31 14:18:22
如何我刪除上面的方法保存的文件? – 2014-04-09 13:41:35