【问题标题】:getSerializable returns different types depending on how app exitedgetSerializable 根据应用退出的方式返回不同的类型
【发布时间】:2016-03-23 02:59:47
【问题描述】:

我需要将int[][] 保存到Bundle 中,以便在onSaveInstanceState() 期间保存它并在onCreate() 上恢复。首先,我决定让它简单明了,将 2D 阵列展平为 1D 并在加载时展平。一切正常。

我决定找到一种更简单的方法。有人告诉我 2D 数组是可序列化的,所以我把它做成这样:

public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putSerializable("CELLS_STATE",universe.getUniverse());

    super.onSaveInstanceState(savedInstanceState);
}//onSaveInstanceState

其中universe.getUniverse() 返回int[][]。

在onCreate()内重新加载:

    if(savedInstanceState != null)
    {//save data exists, reload it
        universe = new Universe( (int[][])savedInstanceState.getSerializable("CELLS_STATE") );
    }

这就是问题所在。如果我运行该程序并转动我的手机以使屏幕改变方向,它加载得非常好。

但是,当我按下主页按钮,然后使用应用程序杀手(在我的情况下是电池医生)杀死应用程序并尝试从菜单重新启动它时,它崩溃了,我只能从第二次尝试启动它,并且保存的状态会丢失。该崩溃中给出的错误指向我在上面指定的getSerializable 行,它是:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to int[][]

这让我很困惑。因此,只要屏幕方向发生变化(可能还有其他变化),getSerializable 就会返回可以转换为 2D 数组的内容(可能是 Serializable)。但是每当应用程序被杀死时,它都会返回一些无法投射的东西。是什么导致了这种奇怪的行为,有没有办法绕过它?

【问题讨论】:

    标签: java android arrays types casting


    【解决方案1】:

    是什么导致了这种奇怪的行为......?

    这似乎是Parcel 的实现中的一个错误,我建议阅读评论#6,其中包含对错误性质的非常好的解释。

    .. 有没有办法绕过它?

    以下代码应该可以工作:

    if (savedInstanceState != null) {
        final Object[] objects = savedInstanceState.getSerializable("CELLS_STATE");
        final int[][] cells = new int[objects.length][];
    
        for (int i = 0; i < objects.length; i++) {
            cells[i] = (int[]) objects[i];
        }
    
        universe = new Universe(cells);
    }
    

    【讨论】:

    • 这说明了很多!也许我会尝试存储 Universe 类的整个实例(而不是 2d 基元数组),并使其可序列化。如果它不起作用,我将坚持我最初的扁平化解决方案。
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多