Android – SharedPreferences con object serializzabile

So che SharedPreferences ha messo putString() , putFloat() , putLong() , putInt() e putBoolean() . Ma devo memorizzare un object che sia di tipo Serializable in SharedPreferences . Come posso raggiungere questo objective?

  • Metodo di rilevamento delle radici in android che non può essere bypassato
  • getClass () in class astratta dà una chiamata a methods ambigui
  • Android Sostituisci frammento all'interno di un frammento
  • equivalente iOS / Objective-C di AsyncTask di Android
  • Spingere notifiche utilizzando FCM non ricevute quando l'app è ucciso android
  • ID canonico GCM
  • Ripeti l'image con ImageView in RelativeLayout
  • Quanto scala in modo proporzionale qualsiasi image (di image) con width pari a "match_parent"?
  • ActionBar in API 8-10 in Android
  • Come posso get il divisore predefinito?
  • Eccezione di Api di Facebook di Android - remote_app_id non corrisponde all'ID immagazzinato
  • ridurre l'animation in schermata schermata in android?
  • 4 Solutions collect form web for “Android – SharedPreferences con object serializzabile”

    In breve, non puoi, provare a serializzare il tuo object in un file privato, significa la stessa cosa. class campione di seguito:

     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; } } 

    Se si oppone è POJO semplice è ansible convertire l'object in string JSON e salvarlo nelle preferenze condivise con putString ().

    È ansible farlo senza un file.

    Sto serializzando le informazioni a base64 e, come questo, posso salvarlo come una string nelle preferenze.

    Il seguente codice è la serializzazione di un object serializzabile alla string base64 e 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 risposta accettata è fuorviante, possiamo memorizzare l'object serializzabile in SharedPreferences utilizzando GSON. Per saperne di più su google-gson .

    è ansible aggiungere la dipendenza GSON nel file Gradle con:

     compile 'com.google.code.gson:gson:2.7' 

    Qui lo snippet:

    Innanzitutto, crea le usuali preferenze condivise:

     //Creating a shared preference SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); 

    Salvataggio da object serializzabile a preferenza:

      Editor prefsEditor = mPrefs.edit(); Gson gson = new Gson(); String json = gson.toJson(YourSerializableObject); prefsEditor.putString("SerializableObject", json); prefsEditor.commit(); 

    Ottieni l'object serializzabile dalla preferenza:

     Gson gson = new Gson(); String json = mPrefs.getString("SerializableObject", ""); yourSerializableObject = gson.fromJson(json, YourSerializableObject.class); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.