【问题标题】:Deserializing an object - how to proceed?反序列化对象 - 如何进行?
【发布时间】:2019-06-22 08:20:27
【问题描述】:

在 IntelliJ 中,我创建了一个 Trie 对象并将其序列化为一个名为“t.txt”的文件。我将此文件移动到与 Android Studio 中的 MainActivity.java 相同的目录中,并运行此代码以尝试获取该对象:

String fileName = "t.txt";
Trie trie = null;
try {
     FileInputStream fis = new FileInputStream(fileName);
     ObjectInputStream ois = new ObjectInputStream(fis);
     trie = (Trie) ois.readObject();
     ois.close();
}
catch(IOException e) {
     System.out.println(e);
}
catch(java.lang.ClassNotFoundException e) {
     System.out.println(e);
}

这给了我一个“找不到文件”错误,表明它无法打开。但是,同样的代码在 IntelliJ 中运行良好。

如何在 Android Studio 中从 t.txt 恢复此对象?

【问题讨论】:

  • 文件路径无效。阅读 Android 中的存储管理。有外部记忆和内部记忆的概念。
  • 您使用的路径样式实际上在 Android Studio 中不起作用。请保存到 getFilesDir()。我会尽快发布答案。

标签: android objectinputstream


【解决方案1】:

这里有一个替代方案。将文件序列化为getFilesDir() 并从那里获取。这样,您就可以轻松进行序列化和反序列化。

检查getFilesDir()中是否存在文件:

boolean doesMyFileExists(Activity activity, String fileName) {
    File[] files = activity.getFilesDir().listFiles();
    for(File i: files) {
        if(i.getName().equals(fileName)) {
            return true;
        }
    }
    return false;
}



序列化对象(MyObject):

void serializeObject(Activity activity, MyObject myObject, String fileName){
    try {
        FileOutputStream fos = activity.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(myObject);
        oos.close();
        fos.close();
    }
    catch(Exception e) {
        //Catch all possible exceptions here
    }

 }



反序列化对象 (MyObject):

MyObject deserializeObject(Activity activity, String fileName){
    try {
        return ((MyObject) (new ObjectInputStream(activity.openFileInput(fileName)).readObject()););
    }
    catch(Exception e) {
        //Catch all possible exceptions here
    }

 }


注意:包含这些方法的类必须实现Serializable 接口。



我希望这会有所帮助,编码愉快!

【讨论】:

  • 感谢塔斯利姆的回复。然而,我觉得我可能有一个根本的误解。我不希望应用程序保存任何数据。本质上,Trie 是一个不变的对象,需要很长时间才能制作出来。我想在用户下载应用程序之前制作 Trie,这样用户所要做的就是在他们打开应用程序并且拥有这个重要对象时对其进行反序列化。这可能吗?
  • 只有当您拥有要反序列化到的类的蓝图时,才能进行反序列化。为什么不添加一个基本的蓝图 Java 类?如果你有这个,你可以随时获取你的反序列化对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2011-04-06
相关资源
最近更新 更多