2011-04-28 9 views

Respuesta

42

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

} 
+0

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")? –

+3

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) –

+1

Cómo se puede Borro el archivo guardado por su método anterior? –

18

Si se opone es POJO simple que se puede convertir objeto de cadena JSON y guardarlo en las preferencias compartidas con putString().

12

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

} 
14

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); 
Cuestiones relacionadas