在 android 中保存数据对象持久内部列表
Saving list of data objects persistent internal in android
我有一个 class 有很多对象,例如
private class MyDataStuff{
private String mostInterestingString;
private int veryImportantNumber
//...you get the idea
public MyDatastuff{
//init stuff...
}
//some getter methods
}
此外,我有一个 class,我们称它为 User
,其中包含 MyDataStuff
列表、一些长整数、字符串等。
我想将 User
的对象存储到内部存储上的文件中。我用下面的代码试了一下:
//loading
try{
FileInputStream fis = this.getApplicationContext().openFileInput("UserData.data");
ObjectInputStream is = new ObjectInputStream(fis);
User loadedUser = (User) is.readObject();
is.close();
fis.close();
appUser = loadedUser;
}catch (Exception e){
Log.e("MainActivity", "Error: loading from the internal storage failed - \n" + e.toString());
}
//Saving
if(appUser == null){
Log.e("MainActivity", "Create new User");
appUser = new User();
try{
FileOutputStream fos = this.getApplicationContext().openFileOutput("UserData.data", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();
fos.close();
}catch (Exception e){
Log.e("MainActivity", "Error: Failed to save User into internal storage - \n" + e.toString());
}
}
这导致 java.io.NotSerializableException
。我阅读了 Serializable-documentation 并制作了
testwise class 用户实现 Serializable 并删除除 longs 和 Strings 之外的每个属性。
它仍然导致这个异常,这让我相信字符串或长整数在默认情况下也不可序列化。
我需要将对象保存为当前状态。有没有更好的方法来做我想做的事情,
如果没有,我该如何解决这个问题?
仔细查看您的序列化代码。
//Saving
if(appUser == null){
Log.e("MainActivity", "Create new User");
appUser = new User();
try{
FileOutputStream fos = this.getApplicationContext()
.openFileOutput("UserData.data", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
...
您正在创建一个新的 User
对象,但您正在序列化 this
,我猜它是 Activity
或 Fragment
。因此,您收到 NotSerializableException
.
String
s 和 Long
s 可以毫无问题地序列化。但是,如果您的最终 User
实现有一个 MyDataStuff
列表,您还必须将其标记为 class Serializable
。
如果要存储用户对象,则需要编写 appUser 对象而不是 "this"。
我有一个 class 有很多对象,例如
private class MyDataStuff{
private String mostInterestingString;
private int veryImportantNumber
//...you get the idea
public MyDatastuff{
//init stuff...
}
//some getter methods
}
此外,我有一个 class,我们称它为 User
,其中包含 MyDataStuff
列表、一些长整数、字符串等。
我想将 User
的对象存储到内部存储上的文件中。我用下面的代码试了一下:
//loading
try{
FileInputStream fis = this.getApplicationContext().openFileInput("UserData.data");
ObjectInputStream is = new ObjectInputStream(fis);
User loadedUser = (User) is.readObject();
is.close();
fis.close();
appUser = loadedUser;
}catch (Exception e){
Log.e("MainActivity", "Error: loading from the internal storage failed - \n" + e.toString());
}
//Saving
if(appUser == null){
Log.e("MainActivity", "Create new User");
appUser = new User();
try{
FileOutputStream fos = this.getApplicationContext().openFileOutput("UserData.data", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();
fos.close();
}catch (Exception e){
Log.e("MainActivity", "Error: Failed to save User into internal storage - \n" + e.toString());
}
}
这导致 java.io.NotSerializableException
。我阅读了 Serializable-documentation 并制作了
testwise class 用户实现 Serializable 并删除除 longs 和 Strings 之外的每个属性。
它仍然导致这个异常,这让我相信字符串或长整数在默认情况下也不可序列化。
我需要将对象保存为当前状态。有没有更好的方法来做我想做的事情, 如果没有,我该如何解决这个问题?
仔细查看您的序列化代码。
//Saving
if(appUser == null){
Log.e("MainActivity", "Create new User");
appUser = new User();
try{
FileOutputStream fos = this.getApplicationContext()
.openFileOutput("UserData.data", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
...
您正在创建一个新的 User
对象,但您正在序列化 this
,我猜它是 Activity
或 Fragment
。因此,您收到 NotSerializableException
.
String
s 和 Long
s 可以毫无问题地序列化。但是,如果您的最终 User
实现有一个 MyDataStuff
列表,您还必须将其标记为 class Serializable
。
如果要存储用户对象,则需要编写 appUser 对象而不是 "this"。