2010-11-07 5 views
101

Angenommen, ich habe eine einfache Klasse, und sobald sie als Objekt instanziiert ist, möchte ich ihren Inhalt in eine Datei serialisieren und sie durch Laden dieser Datei zu einem späteren Zeitpunkt abrufen ... Ich bin mir nicht sicher, wo ich anfangen soll hier, Was muss ich tun, um dieses Objekt in eine Datei zu serialisieren?Wie serialisiere ich ein Objekt und speichere es in einer Datei 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? */ 
    } 
} 

Dies ist wahrscheinlich die einfachste Frage in der Welt, denn dies ist eine wirklich einfache Aufgabe in .NET ist, aber in Android Ich bin ziemlich neu, so bin ich völlig verloren.

Antwort

217

Saving (w/o Ausnahmebehandlung Code):

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

Laden (w/o Ausnahmebehandlung Code):

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

Sehr nützlich. Könnten Sie bitte erklären, ob wir die Klasse zum Schreiben als Objektdatei serialisieren müssen. –

+4

Diese Funktionalität wird Ihrer Klasse implizit hinzugefügt, wenn Sie die serialisierbare Schnittstelle verwenden. Wenn Sie nur eine einfache Objektserialisierung wünschen, würde ich das verwenden. Es ist extrem einfach zu implementieren. http://developer.android.com/reference/java/io/Serializable.html – mtmurdock

+5

+1, für mehrere Objekte speichern gibt es Trick erforderlich: http://Stackoverflow.com/a/1195078/1321401 – Luten

30

ich diese 2 Optionen ausprobiert habe (Lesen/Schreiben) , mit einfachen Objekten Array von Objekten (150 Objekte), Karte:

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(); 

Option 2 ist zweimal schneller als Option 1

Die Option 2 Unannehmlichkeit ist, dass Sie spezifischen Code für Lese machen müssen:

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

Kompletter Code mit Fehlerbehandlung und hinzugefügtem Dateistream wird geschlossen. Fügen Sie es Ihrer Klasse hinzu, die serialisiert und deserialisiert werden soll. In meinem Fall ist der Klassenname CreateResumeForm. Sie sollten es zu Ihrem eigenen Klassennamen ändern. Android Schnittstelle Serializable ist nicht ausreichend, um Ihre Objekte in der Datei zu speichern, es erstellt nur Streams.

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

es so den Einsatz in Ihrem Activity:

form = CreateResumeForm.readFromFile(this); 
6

Ich habe gerade eine Klasse dies mit Generics zu handhaben, so dass es mit allen Objekttypen verwendet werden, die serialisierbar sind:

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

} 
Verwandte Themen