Android 内部存储中的文件更新后无法读取

File in Android internal storage not readable after update

我在 google Play 商店上有一个应用程序。在这个应用程序中,我将一些数据保存在一个文件中(数据库会更好,但现在意味着更多的工作)。这非常有效,但问题是当我是 运行 版本 2 时,我将数据保存在文件中,我可以取回它。但是,如果我随后更新到版本 3,则不会加载数据,但该文件仍然存在于应用程序 'files' 目录中。该文件保存在设备的内部存储器中。现在我不知道为什么会这样,但我在互联网上读到另一个 sharedUserId 可能是原因,但我的清单中没有任何 sharedUserId。我知道 Android 然后会生成一个,但是这个总是一样的吗?即使该应用程序是在另一台计算机上编译的? 有人可以帮忙吗?

提前致谢!

编辑

我用来读写文件的一些代码:

要写:

try {
            FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(object);
            os.close();

        } catch (IOException e) {
            LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage());
        } finally {

        }

阅读:

try {
            FileInputStream fis = context.openFileInput(fileName);
            ObjectInputStream is;
            is = new ObjectInputStream(fis);
            Serializable objectOut = (Serializable) is.readObject();
            is.close();
            return objectOut;
        } catch (StreamCorruptedException e) {
            LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage());
        } catch (IOException e) {
            LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage());
        } catch (ClassNotFoundException e) {
            LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage());
        }
        return null;

更新后,该文件似乎没有任何内容,但我也没有收到任何错误。使用 ROOT 文件资源管理器,我可以转到 /data/data/myApp/files/ 并在那里找到与更新前大小相同的文件。

无需任何自定义即可序列化,不应用于长期存储,因为对象的格式可能会在应用程序版本之间发生变化。我假设您在新版本中向对象添加了一个变量(或更改了库对象),因此您的 Serializable 已损坏。
你应该做的是通过覆盖函数来使用自定义序列化

private void writeObject(java.io.ObjectOutputStream out) throws IOException`

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

private void readObjectNoData() throws ObjectStreamException;

要检索旧数据,请更改序列化以准确读取旧格式。您还应该在以后将一些版本标识符添加到序列化中,以便您可以正确读取它。
所有这些都非常混乱,通常你最好保存到 json(或 XML),这样会更健壮。

此问题的原因可能是在您的序列化对象上忽略了使用 serialVersionUID,如下所示:

private static final long serialVersionUID = -2671479145551722098L;