我有一个包含很多对象的课程,比如
private class MyDataStuff{
private String mostInterestingString;
private int veryImportantNumber
//...you get the idea
public MyDatastuff{
//init stuff...
}
//some getter methods
}
此外我有一个类,我们称之为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文档并制作完成
testwise类用户实现Serializable并删除除longs和Strings之外的每个属性。
它仍然会导致这个异常,这让我相信字符串或长片默认也不可序列化。
我需要将对象保存在当前状态。做我想做的事情是否有更好的方法, 如果没有,我该如何解决这个问题呢?
答案 0 :(得分:1)
仔细查看序列化代码。
//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
和Long
可以序列化,没有任何问题。但是,如果您的最终User
实施具有MyDataStuff
列表,则您还必须标记其类Serializable
。
答案 1 :(得分:0)
你需要编写appUser对象而不是"这个"如果要存储用户对象。