Android - SharedPreferences с сериализуемым объектом - PullRequest
42 голосов
/ 28 апреля 2011

Я знаю, что SharedPreferences имеет putString(), putFloat(), putLong(), putInt() и putBoolean().Но мне нужно хранить объект типа Serializable в SharedPreferences.Как мне этого добиться?

Ответы [ 5 ]

47 голосов
/ 28 апреля 2011

Короче говоря, вы не можете попробовать сериализовать ваш объект в частный файл, это равносильно тому же.образец класса ниже:

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

}
26 голосов
/ 29 июня 2016

Принятый ответ вводит в заблуждение, мы можем сохранить сериализуемый объект в SharedPreferences с помощью GSON.Подробнее об этом на google-gson .

. Вы можете добавить зависимость GSON в файл Gradle с помощью:

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

Вот фрагмент:

Сначала создайте ваши обычные sharedPreferences:

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

Сохранение из сериализуемого объекта в предпочтение:

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

Получение сериализуемого объекта из предпочтения:

Gson gson = new Gson();
String json = mPrefs.getString("SerializableObject", "");
yourSerializableObject = gson.fromJson(json, YourSerializableObject.class);
19 голосов
/ 06 марта 2013

Если вы используете простой POJO, вы можете преобразовать объект в строку JSON и сохранить его в общих настройках с помощью метода putString ().

15 голосов
/ 30 ноября 2015

Это можно сделать без файла.

Я сериализую информацию в base64 и, таким образом, я могу сохранить ее в виде строки в настройках.

Следующий код сериализует сериализуемый объект в строку base64 и наоборот: импорт 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;
    }

}
1 голос
/ 03 июня 2019

Мы можем создать простой в использовании синтаксис с Kotlin.

@Throws(JsonIOException::class)
fun Serializable.toJson(): String {
   return Gson().toJson(this)
}

@Throws(JsonSyntaxException::class)
 fun <T> String.to(type: Class<T>): T where T : Serializable {
 return Gson().fromJson(this, type)
}

@Throws(JsonIOException::class)
fun SharedPreferences.Editor.putSerializable(key: String, o: Serializable?) = apply {
   putString(key, o?.toJson())
}

@Throws(JsonSyntaxException::class)
   fun <T> SharedPreferences.getSerializable(key: String, type: Class<T>): T? where T : Serializable {
    return getString(key, null)?.to(type)
}

и затем сохраните любой Сериализуемый в SharedPreferences, используя аналогичный get/put()

Суть здесь Сохранение сериализуемых таблиц в общих настройках с Kotlin и GSON

Как упоминалось в других ответах, вам, возможно, придется учитывать миграцию при изменении структуры класса данных. Или, по крайней мере, придется изменить ключ, который вы используете для хранения.

...