如何避免在从bundle中检索可序列化对象时收到未经检查的强制转换警告



在我的应用程序中,我有一个活动,该活动具有一个名为 mSelectedContacts 的类型为 HashSet<Integer> 的成员变量,它是活动状态的一部分,所以我将其保存在这样的onSaveInstanceState()

public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putSerializable(STATE_SELECTED_CONTACTS, mSelectedContacts);
    super.onSaveInstanceState(savedInstanceState);
}

在重新创建活动时,我得到了这样存储的哈希集。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null &&
            savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
        mSelectedContacts = (HashSet<Integer>)
                savedInstanceState.getSerializable(STATE_SELECTED_CONTACTS);
    } else
        mSelectedContacts = new HashSet<Integer>();
    ...

现在这工作正常,但它会生成一个未经检查的强制转换警告(从java.io.serializable到java.lang.Integer)。有没有其他方法可以将可序列化的对象保存到捆绑包中,然后在没有收到此警告的情况下检索它?(当然除了压制它:-))

当您使用该方法将某些内容存储在捆绑包中时putSerializable(String key, Serializable value)您会丢失有关存储数据类型的一些信息,因为该方法存储任何Serializable并且它不在乎它是否是Serializable的特定实现,即HashSet。由于信息丢失,因此无法神奇地确定getSerializable存储的类型。因此,基本上任何避免显式强制转换引起的警告的尝试都不会阻止实际转换的发生。

if (savedInstanceState != null &&
        savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
    mSelectedContacts = Sets.newHashSet(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS);
} else
    mSelectedContacts = new HashSet<Integer>();

@Override protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putIntegerArrayList(STATE_SELECTED_CONTACTS, Lists.newArrayList(mSelectedContacts);
}

但这有点多余,在这种情况下,我建议忽略此警告。因为你知道序列化字段类型是哈希集

你可以尝试使用整数数组列表和中间:

savedInstanceState.putIntegerArrayList(STATE_SELECTED_CONTACTS, new ArrayList<Integer>(mSelectedContacts));

然后像这样读回去:

mSelectedContacts = new HashSet<Integer>(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS));

最新更新