Sé que SharedPreferences tiene putString()
, putFloat()
, putLong()
, putInt()
y putBoolean()
. Pero necesito almacenar un objeto que sea de tipo Serializable
en SharedPreferences
. ¿Cómo puedo conseguir esto?Android - SharedPreferences con el objeto serializable
Respuesta
En resumen, no puede, trate de serializar su objeto a un archivo privado, equivale a lo mismo. clase de muestra a continuación:
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;
}
}
Si se opone es POJO simple que se puede convertir objeto de cadena JSON y guardarlo en las preferencias compartidas con putString().
Es posible hacerlo sin un archivo.
Estoy serializando la información a base64 y así puedo guardarlo como una cadena en las preferencias.
El siguiente código es la serialización de un objec serializable a base64 string y viceversa: 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;
}
}
La respuesta aceptada es engañosa, podemos almacenar objetos serializables en SharedPreferences usando GSON. Obtenga más información al respecto en google-gson.
puede agregar GSON dependencia en Gradle presentar con:
compile 'com.google.code.gson:gson:2.7'
Aquí el fragmento:
primer lugar, crear sus SharedPreferences habituales:
//Creating a shared preference
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
de ahorro de objeto serializable a la preferencia:
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(YourSerializableObject);
prefsEditor.putString("SerializableObject", json);
prefsEditor.commit();
obtener el objeto serializable de preferencia:
Gson gson = new Gson();
String json = mPrefs.getString("SerializableObject", "");
yourSerializableObject = gson.fromJson(json, YourSerializableObject.class);
- 1. android sharedpreferences establecer valor
- 2. Limitaciones de Android SharedPreferences?
- 3. Android Parcelable y Serializable
- 4. Android: ¿Ver archivo SharedPreferences?
- 5. NullPointerException en SharedPreferences Android
- 6. Android SharedPreferences en Fragment
- 7. Android: Copiar/Duplicar SharedPreferences
- 8. objeto no es JSON serializable
- 9. android - sharedpreferences return value nulo
- 10. ¿Qué es SharedPreferences en Android?
- 11. Guardar el objeto serializable en el registro en .net?
- 12. ¿Cómo almacenar un objeto Date en SharedPreferences?
- 13. parcelable encontró IOException escribiendo objeto serializable
- 14. androide: Problema con objeto Serializable puesto en la intención
- 15. ¿Cómo uso un objeto scala @serializable?
- 16. Android SharedPreferences Copia de seguridad no funciona
- 17. Android: uso de SharedPreferences en una biblioteca
- 18. java.io.NotSerializableException mientras se escribe objeto Serializable en el almacenamiento externo?
- 19. Archivo SharedPreferences
- 20. Android: escribir y obtener el objeto
- 21. cifrar datos en SharedPreferences
- 22. Android: Descargar el objeto
- 23. Persistir en un objeto que no está marcado como serializable
- 24. android-maven-plugin: método de implementación que no elimina SharedPreferences
- 25. subclase de la clase Serializable padre que no serializable
- 26. ¿Se pueden compartir SharedPreferences entre diferentes aplicaciones de Android?
- 27. SharedPreferences a veces se eliminan
- 28. Serializar un objeto que tiene una clase primaria no serializable
- 29. Cómo comprobar si un objeto es serializable en C#
- 30. ¿Se puede hacer un objeto serializable en tiempo de ejecución?
caso de 'filename' en el código de ser una ruta absoluta (por ejemplo: "/data/com.example.myapp/foobar.dat"), o debe ser relativa (por ejemplo: "foobar.dat")? –
solo un nombre de archivo, los separadores de ruta no están permitidos, como se indica en el documento de la API http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String, int) –
Cómo se puede Borro el archivo guardado por su método anterior? –