2014-12-27 67 views
0

检索序列化对象时,在我的应用程序越来越选中铸警告我有了一个名为型mSelectedContacts一个成员变量,它是活动状态的一部分的活动,所以我将其保存在onSaveInstanceState()像这如何避免捆绑

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

当重新创建活动,我得到存储的Hashset像这样。

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中)。有没有其他的方法可以将一个可序列化的对象保存到一个包中,然后在没有得到此警告的情况下检索它? (除抑制当然:-)吧)

+0

不,我不认为有任何办法。我知道的唯一方法是让序列化采用一个Integer的泛型。但是,显然我们不能这样做。所以如果你知道它不会采取任何其他措施,那么压制战斗是最好的方法。尽我所知 – 2014-12-27 18:23:36

回答

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

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

0

当存储使用putSerializable(String key, Serializable value)方法你失去对存储的数据类型的一些信息在包的东西,作为方法存储任何Serializable,它不介意这是Serializable的具体实现,即HashSet。由于信息丢失,因此无法在getSerializable中奇迹般地确定您存储的是哪种类型。所以基本上任何避免显式投射引起的警告的尝试都不会阻止实际投射的发生。

0

你可以尝试使用一个整数的ArrayList的中间:

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

,然后读出来这样的:

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