Bundle 对象支持Parcels,但Parcel.marshall() documentation 表示:
您在此处检索的数据不得放置在任何类型的持久性存储中(本地磁盘、网络等)。为此,您应该使用标准序列化或另一种通用序列化机制。 Parcel marshalled 表示针对本地 IPC 进行了高度优化,因此不会尝试保持与平台不同版本中创建的数据的兼容性。
最简单的序列化机制可能是 JSON,它是一种可读的文本格式。
要创建 JSON 字符串,您必须构造一棵 JSONObject/JSONArray 对象树:
// write
JSONObject json = new JSONObject();
json.put("u", mp);
JSONArray mealplan_json = new JSONArray();
mealplan_json.put(...); // fill arrays recursively
json.put("m", mealplan_json);
String text = json.toString();
// read
JSONObject json = new JSONObject(text);
mp = json.getString("u");
JSONArray mealplan_json = json.getJSONArray("m");
...
如果你想用二进制编码节省空间,你必须使用序列化,它支持基本类型和任何正确实现java.io.Serializable的对象:
// write
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(mp);
oos.writeObject(mealplan);
oos.close();
byte[] bytes = bos.toByteArray();
// read
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
mp = (String) ois.readObject();
mealplan = (String[][][][]) ois.readObject();
请注意,此二进制序列化不存储任何键名(“u”、“m”),因此您必须确保应用的所有版本都以相同的顺序写入和读取相同的对象。
如果你想要一个键/值结构,你必须实现自己的辅助函数,这些函数在前面写一个单独的键字符串,并将任意数量的键/值对读入映射。
或者,创建您自己的包含所需元素的可序列化对象(并注意此类在您的应用的未来版本中保持兼容):
class MealPlanData implements Serializable {
String u;
String[][][][] mp;
};
如果您只有一个Bundle 对象并且不知道它的结构,则必须手动处理键/值:
// write
oos.writeInt(bundle.size());
for (String key : bundle.keySet()) {
Object value = bundle.get(key);
oos.writeObject(key);
oos.writeObject(value);
}
// read
int size = ios.readInt();
Map<String, Object> map = new ArrayMap<String, Object>();
for (int i = 0; i < size; i++) {
String key = (String) ios.readObject();
Object value = ios.readObject();
map.put(key, value);
}