使用可打包将项目存储为共享首选项?

2022-09-01 13:31:10

我有几个对象,位置,在我的应用程序中存储在ArrayList中,并使用可打包在活动之间移动这些对象。该对象的代码如下所示:

public class Location implements Parcelable{

private double latitude, longitude;
private int sensors = 1;
private boolean day;
private int cloudiness;

/*
Måste ha samma ordning som writeToParcel för att kunna återskapa objektet.
 */
public Location(Parcel in){
    this.latitude = in.readDouble();
    this.longitude = in.readDouble();
    this.sensors = in.readInt();
}

public Location(double latitude, double longitude){
    super();
    this.latitude = latitude;
    this.longitude = longitude;
}

public void addSensors(){
    sensors++;
}


public void addSensors(int i){
    sensors = sensors + i;
}

+ Some getters and setters.

现在我需要更永久地存储这些对象。我在某处读到我可以序列化对象并另存为共享首选项。我是否必须实现可序列化,或者是否可以对可打包执行类似的操作?


答案 1

由于可打包无法将数据放在持久性存储中(请参阅StenSoft的答案),因此您可以使用gson来保留您的位置:

保存位置:

val json = Gson().toJson(location)
sharedPreferences.edit().putString("location", json).apply()

检索位置:

val json = sharedPreferences.getString("location", null)
return Gson().fromJson(json, Location::class.java)

如果您仍在使用 Java,请将 替换为 、,并将每行替换为半列。valStringGson()new Gson()::class.java.class


答案 2

包裹文件

包裹不是通用的序列化机制。此类(以及用于将任意对象放入包裹中的相应可包裹 API)被设计为高性能 IPC 传输。因此,将任何 Parcel 数据放入持久性存储是不合适的:在 Parcel 中任何数据的基础实现中发生更改可能会使较旧的数据不可读。


推荐