Java (objectinputstream)ObjectInput.readObject()给了我一个空对象

Java (objectinputstream)ObjectInput.readObject()给了我一个空对象,java,android,serializable,objectoutputstream,objectinputstream,Java,Android,Serializable,Objectoutputstream,Objectinputstream,我有这门课: public class SaveState implements Serializable { private static final long serialVersionUID = 1L; public List<String> downloadedMagazinesIds = new ArrayList<String>();//id's de revistas descargadas public List<String

我有这门课:

public class SaveState implements Serializable {
    private static final long serialVersionUID = 1L;
    public List<String> downloadedMagazinesIds = new ArrayList<String>();//id's de revistas descargadas
    public List<String> downloadedMagazinesSummaries = new ArrayList<String>();//página sumario de cada magazine
    public List<FullMagazine> downloadedMagazines = new ArrayList<FullMagazine>();//todos los magazines bajados
    public Magazines ms=null; //Esta clase contiene el array de previews de revistas generado con el parser de XML
}
每次我的应用程序关闭时,我都会存储该对象,每次我的应用程序打开时,我都会从SD卡读取该对象,并且该对象工作正常。当我创建了一个更新版本的应用程序(1.01)时,问题就出现了。当我启动应用程序并尝试从SD卡读取文件时,文件被读取,但对象类的所有变量都是空的,它们实际上不是空的


为什么我的代码不能正常工作?我应该怎么做才能解决这个问题?

我试图编辑您的问题,使其更具可读性和可理解性。希望它能帮助你得到一些好的答案

我建议如下

  • 尝试使用相同的1.0版本阅读它。这将消除任何“版本”/“清单”相关问题
  • 您的FullMagazine可能是根本原因,请删除该对象并重试

  • 告诉我你发现了什么。这是一个有趣的问题。

    首先,摆脱可怕的异常处理-您几乎永远不会捕获到
    IOException
    ,而且我不清楚
    e.printStackTrace()
    是否会进入相关日志-您检查过它的位置了吗?另外,你的
    close
    调用应该在
    finally
    块内。我没有得到任何异常,我只是得到一个空的object。考虑到你的异常处理,如果你有异常,你肯定会注意到吗?你能制作一个简短但完整的程序来演示这个问题吗?Jon Skeet,你的意思是“删除异常”。是的,我同意。捕捉异常是一种可怕的编码实践。我也有同样的问题。当我为生产创建一个新版本时,它读取旧对象,但它们都是空的(整数字段中的null和zero等)。我能够检索文件(流),它实际上不是空的。我没有在应用程序版本之间更改此对象(我检查并再次检查),但仍然。。旧版本序列化的文件无法在新版本中读取。serialVersionUID已设置,并且它是相同的(否则将是异常)。如果我尝试使用1.0版读取它,我在读取它时没有问题,我会收到正确的对象。我不明白你的第二点是什么意思。如果我删除该对象,显然我无法读取它。如果您删除FullMagazine对象,您将能够“通过删除进行调试”,并找到根本原因:)。我不明白您的意思,每次启动应用程序时,都会使用loadData函数生成FullMagazine对象。。与SaveState classI中的所有其他元素一样,我没有完整的代码。我所能做的就是假设由于应用程序版本之间的序列化/反序列化而可能出现一些常规问题。其他两个对象是可序列化的,但在不知道FullMagazine实现的组成的情况下,我无法意识到这是否是问题的根本原因。因此,我要求您删除该对象,以将问题隔离到android框架(版本间序列化)问题,或者它可能是一个FullMagazine问题。在这个问题上,我没什么可以帮你的了。哦,问题不在FullMagazine上,因为其他对象也是空的。而且它们还包含数据。。。。
    public static void saveData(){
        ObjectOutput out;
        try {
            //primero comprobamos si existe el directorio, y si no, lo creamos.
            File folder = new File(Environment.getExternalStorageDirectory() + "/C/");
            if(!folder.exists())
                folder.mkdirs();
    
            File outFile = new File(Environment.getExternalStorageDirectory(), "/C/appSaveState.data");
            out = new ObjectOutputStream(new FileOutputStream(outFile)); 
            out.writeObject(saveState);
            out.close();
        } catch (Exception e) {e.printStackTrace();}
    }
    
    
    public static void loadData(){
        ObjectInput in;
        try {
            File inFile = new File(Environment.getExternalStorageDirectory(), "/C/appSaveState.data");
            in = new ObjectInputStream(new FileInputStream(inFile));        
            saveState=(SaveState) in.readObject();
            in.close();
        } catch (Exception e) {e.printStackTrace();}
    }