Как я сериализую объект и сохраняю его в файл на 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? */ } } 

Это, наверное, самый простой вопрос в мире, потому что это очень простая задача в .NET, но в Android я довольно новый, поэтому я полностью потерян.

Solutions Collecting From Web of "Как я сериализую объект и сохраняю его в файл на Android?"

Сохранение (без кода обработки исключений):

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

Загрузка (без кода обработки исключений):

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

Я пробовал эти 2 варианта (чтение / запись), с обычными объектами, массивом объектов (150 объектов), Map:

Опция 1:

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

Вариант 2 в два раза быстрее, чем вариант 1

Недостатком варианта 2 является то, что вам нужно сделать специальный код для чтения:

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

Полный код с обработкой ошибок и добавленным потоком файлов закрывается. Добавьте его в свой класс, чтобы вы могли сериализовать и десериализовать. В моем случае имя класса – CreateResumeForm . Вы должны изменить его на свое собственное имя класса. Интерфейс Android Serializable недостаточен для сохранения ваших объектов в файл, он создает только потоки.

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

Используйте его в своей Activity :

 form = CreateResumeForm.readFromFile(this); 

Я просто создал класс для обработки этого с помощью Generics, поэтому его можно использовать со всеми типами объектов, которые могут быть сериализованы:

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