【问题标题】:(objectinputstream) ObjectInput.readObject() is giving me an empty object(objectinputstream) ObjectInput.readObject() 给了我一个空对象
【发布时间】:2012-06-08 07:45:40
【问题描述】:

我有这门课:

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
}

我使用这些方法将类(SaveState 对象)存储在 sdcard 中,并再次将文件中的对象读入对象:

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();}
}

我存储对象,每次我的应用程序关闭时,我每次打开我的应用程序时都从 sdcard 读取对象,它工作正常。当我创建更新版本的应用程序(1.01)时,问题就来了。当我启动应用程序并尝试从 sdcard 读取文件时,文件已被读取,但对象类的所有变量都是空的,而且它们真的不为空。

为什么我的代码不能正常工作?我该怎么做才能解决它?

【问题讨论】:

  • 首先,摆脱你可怕的异常处理——你几乎不应该捕获IOException,我不清楚e.printStackTrace()会去相关日志——你检查过它在哪里会去吗?此外,您的close 调用应在finally 块内。
  • 我没有得到任何异常,我只是得到并清空对象
  • 鉴于您的异常处理,如果您有异常,您肯定会通知吗?你能制作一个简短但完整的程序来演示这个问题吗?
  • Jon Skeet,你的意思是“删除异常”。是的我同意。捕获异常的可怕编码实践。
  • 我也有同样的问题。当我为 Production 创建一个新版本时,它会读取旧对象,但它们都是空的(整数字段中的空值和零等)。我能够检索文件(流),它实际上不是空的。我没有在应用程序版本之间更改此对象,(我检查并仔细检查),但仍然..旧版本序列化的文件无法在新版本中读取。 serialVersionUID 已设置且相同(否则会异常)。

标签: java android serializable objectoutputstream objectinputstream


【解决方案1】:

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

我建议如下

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

让我知道你发现了什么。这是一个有趣的问题。

【讨论】:

  • 如果我尝试使用 1.0 版阅读它,我没有问题阅读它,我收到了正确的对象。我不明白你对第 2 点的意思。如果我删除该对象,我显然无法阅读它。
  • 如果您删除 FullMagazine 对象,您将能够“通过消除进行调试”并找到根本原因:)。
  • 我不明白你的意思,每次我启动应用程序时,都会使用 loadData 函数生成 fullmagazine 对象。就像 SaveState 类中的所有其他元素一样
  • 我没有你的完整代码。我所能做的就是假设由于应用程序版本之间的序列化/反序列化可能会出现一些常规问题。其他 2 个对象是可序列化的,但在不知道您的 FullMagazine 实现的组成的情况下,我无法意识到它是否是您问题的根本原因。因此,我要求您消除该对象以将问题隔离到 android 框架(版本序列化之间)问题,或者它可能是 FullMagazine 问题。在这方面我无话可说。
  • 哦,问题不在 FullMagazine 上,因为其他对象也是空的。他们应该包含数据....
猜你喜欢
  • 2012-07-23
  • 2013-11-09
  • 2018-08-25
  • 2014-12-24
  • 2021-10-08
  • 2021-10-31
  • 2016-08-07
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多