2010-11-07 10 views
101

Supponiamo di avere una classe semplice e una volta creata un'istanza come oggetto, voglio essere in grado di serializzare il suo contenuto in un file e recuperarlo caricando quel file in un secondo momento ... Non so da dove iniziare qui, cosa devo fare per serializzare questo oggetto su un file?Come serializzare un oggetto e salvarlo su un file in Android?

public class SimpleClass { 
    public string name; 
    public int id; 
    public void save() { 
     /* wtf do I do here? */ 
    } 
    public static SimpleClass load(String file) { 
     /* what about here? */ 
    } 
} 

Questa è probabilmente la domanda più semplice del mondo, perché questo è un compito molto semplice in .NET, ma in Android sono abbastanza nuovo, quindi sono completamente perso.

risposta

217

legale (w/o eccezione codice di gestione):

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
ObjectOutputStream os = new ObjectOutputStream(fos); 
os.writeObject(this); 
os.close(); 
fos.close(); 

carico (w/o eccezione codice di gestione):

FileInputStream fis = context.openFileInput(fileName); 
ObjectInputStream is = new ObjectInputStream(fis); 
SimpleClass simpleClass = (SimpleClass) is.readObject(); 
is.close(); 
fis.close(); 
+0

Molto utile. Potresti spiegare se dobbiamo serializzare la classe per scrivere come file oggetto. –

+4

Questa funzionalità è implicitamente aggiunta alla classe se si utilizza l'interfaccia Serializable. Se tutto ciò che si desidera è una semplice serializzazione degli oggetti, è quello che userò. È anche estremamente facile da implementare. http://developer.android.com/reference/java/io/Serializable.html – mtmurdock

+5

+1, per il salvataggio di più oggetti è necessario un trucco: http://stackoverflow.com/a/1195078/1321401 – Luten

30

Ho provato questo 2 opzioni (lettura/scrittura) , con oggetti semplici, array di oggetti (150 oggetti), Mappa:

Option1:

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
ObjectOutputStream os = new ObjectOutputStream(fos); 
os.writeObject(this); 
os.close(); 

Option2:

SharedPreferences mPrefs=app.getSharedPreferences(app.getApplicationInfo().name, Context.MODE_PRIVATE); 
SharedPreferences.Editor ed=mPrefs.edit(); 
Gson gson = new Gson(); 
ed.putString("myObjectKey", gson.toJson(objectToSave)); 
ed.commit(); 

Opzione 2 è due volte più veloce di opzione 1

L'inconveniente l'opzione 2 è che si deve fare codice specifico di lettura:

Gson gson = new Gson(); 
JsonParser parser=new JsonParser(); 
//object arr example 
JsonArray arr=parser.parse(mPrefs.getString("myArrKey", null)).getAsJsonArray(); 
events=new Event[arr.size()]; 
int i=0; 
for (JsonElement jsonElement : arr) 
    events[i++]=gson.fromJson(jsonElement, Event.class); 
//Object example 
pagination=gson.fromJson(parser.parse(jsonPagination).getAsJsonObject(), Pagination.class); 
4

Il codice completo con la gestione degli errori e il flusso di file aggiunto vengono chiusi. Aggiungilo alla tua classe che vuoi essere in grado di serializzare e deserializzare. Nel mio caso il nome della classe è CreateResumeForm. Dovresti cambiarlo con il nome della tua classe. L'interfaccia Android non è sufficiente per salvare gli oggetti nel file, ma crea solo flussi.

// Constant with a file name 
public static String fileName = "createResumeForm.ser"; 

// Serializes an object and saves it to a file 
public void saveToFile(Context context) { 
    try { 
     FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     objectOutputStream.writeObject(this); 
     objectOutputStream.close(); 
     fileOutputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 


// Creates an object by reading it from a file 
public static CreateResumeForm readFromFile(Context context) { 
    CreateResumeForm createResumeForm = null; 
    try { 
     FileInputStream fileInputStream = context.openFileInput(fileName); 
     ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
     createResumeForm = (CreateResumeForm) objectInputStream.readObject(); 
     objectInputStream.close(); 
     fileInputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return createResumeForm; 
} 

usare in questo modo nella tua Activity:

form = CreateResumeForm.readFromFile(this); 
6

Ho appena fatto una classe per gestire questa situazione con i generici, in modo che può essere utilizzato con tutti i tipi di oggetti che sono serializzabile:

public class SerializableManager { 

    /** 
    * Saves a serializable object. 
    * 
    * @param context The application context. 
    * @param objectToSave The object to save. 
    * @param fileName The name of the file. 
    * @param <T> The type of the object. 
    */ 

    public static <T extends Serializable> void saveSerializable(Context context, T objectToSave, String fileName) { 
     try { 
      FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 

      objectOutputStream.writeObject(objectToSave); 

      objectOutputStream.close(); 
      fileOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Loads a serializable object. 
    * 
    * @param context The application context. 
    * @param fileName The filename. 
    * @param <T> The object type. 
    * 
    * @return the serializable object. 
    */ 

    public static<T extends Serializable> T readSerializable(Context context, String fileName) { 
     T objectToReturn = null; 

     try { 
      FileInputStream fileInputStream = context.openFileInput(fileName); 
      ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 
      objectToReturn = (T) objectInputStream.readObject(); 

      objectInputStream.close(); 
      fileInputStream.close(); 
     } catch (IOException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return objectToReturn; 
    } 

    /** 
    * Removes a specified file. 
    * 
    * @param context The application context. 
    * @param filename The name of the file. 
    */ 

    public static void removeSerializable(Context context, String filename) { 
     context.deleteFile(filename); 
    } 

} 
Problemi correlati