Android – SharedPreferences con objeto serializable
Sé que SharedPreferences tiene putString()
, putFloat()
, putLong()
, putInt()
y putBoolean()
. Pero necesito almacenar un objeto que sea del tipo Serializable
en SharedPreferences
. ¿Cómo puedo conseguir esto?
- ¿Está bien para guardar una matriz JSON en SharedPreferences?
- Botón Inicio de la barra de acciones no funcional con PreferredScreen anidado
- SharedPreferences no se guardará / cargará en PreferenciaActividad
- Expectativa de puntero nulo al obtener valores de preferencia compartida
- Editar las preferencias compartidas de DDMS
- Preferencias compartidas de Android con múltiples actividades
- Android: Modificar las preferencias compartidas de otra aplicación
- Expectativa de puntero nulo al comprobar si SharedPrefs es igual a Null
- NullPointerException en PreferenceManager.getDefaultSharedPreferences en el inicio
- Usar SharedPreferences en modo multiproceso
- Nube de Android - Administrador de copia de seguridad vs unidad
- Preferencia y comprobación de la casilla de verificación si está activada o desactivada
- Arquitectura de la aplicación de Android: RxJava
En resumen usted no puede, intente serializar su objeto a un archivo privado, él asciende a la misma cosa. Ejemplo de clase 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 el objeto es simple POJO puede convertir objeto a cadena JSON y guardarlo en las preferencias compartidas con putString ().
Es posible hacerlo sin un archivo.
Estoy serializando la información a base64 y como esto soy capaz de guardarlo como una cadena en las preferencias.
El siguiente código es Serializar un objeto serializable a la cadena base64 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 objeto serializable en SharedPreferences usando GSON. Lea más sobre ello en google-gson .
Puede agregar GSON dependencia en el archivo Gradle con:
compile 'com.google.code.gson:gson:2.7'
Aquí el fragmento:
Primero, crea tus preferencias compartidas usuales:
//Creating a shared preference SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
Ahorro de objeto serializable a preferencia:
Editor prefsEditor = mPrefs.edit(); Gson gson = new Gson(); String json = gson.toJson(YourSerializableObject); prefsEditor.putString("SerializableObject", json); prefsEditor.commit();
Obtenga un objeto serializable de preferencia:
Gson gson = new Gson(); String json = mPrefs.getString("SerializableObject", ""); yourSerializableObject = gson.fromJson(json, YourSerializableObject.class);
- Obtener URI del archivo .mp3 almacenado en la carpeta res / raw en android
- Android – Imagen parpadeante utilizando la animación Alpha fade