SharedPreferencesにはputString()
、putFloat()
、putLong()
、putInt()
およびputBoolean()
があることを知っています。しかし、タイプSerializable
のオブジェクトをSharedPreferences
に保存する必要があります。どうすればこれを達成できますか?
つまり、オブジェクトをプライベートファイルにシリアル化してみてください。これは同じことです。以下のサンプルクラス:
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;
}
}
受け入れられた答えは誤解を招くものであり、GSONを使用してSharedPreferencesにシリアル化可能なオブジェクトを格納できます。詳しくは google-gson をご覧ください。
あなたはGradleファイルにGSON依存関係を追加することができます:
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);
オブジェクトが単純なPOJOの場合、オブジェクトをJSON文字列に変換し、putString()を使用して共有設定に保存できます。
ファイルなしでも実行できます。
情報をbase64にシリアル化しています。このようにして、プリファレンスに文字列として保存できます。
次のコードは、シリアル化可能なオブジェクトをbase64文字列に、またはその逆にシリアル化しています: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;
}
}
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)
}
_
同様のget/put()
を使用して、SerializableをSharedPreferences
に保存します
ここで要点を完成 シリアル化可能なものをKotlinとGSONの共有設定に保存
他の回答で述べたように、データクラスの構造が変更された場合は、移行を検討する必要がある場合があります。または、少なくとも、保存に使用するキーを変更する必要があります。