我有一个包含可序列化对象的数组,我正在尝试使用Intent的putExtra()和Bundle的getSerializable()。但是,我得到了一个阶级演员例外,并且不明白为什么。
以下是代码。 UserInfo是我自己的类,它实现了Serializable,我能够在活动之间传递单个UserInfo对象。我在尝试使用数组时遇到了这个问题。
代码发送序列化:
Intent intent = new Intent( JOIN_GROUP ); //JOIN_GROUP is a constant string
String user_ids[] = packet.userIDs();
int length = user_ids.length;
UserInfo users[] = new UserInfo[length];
for ( int i = 0; i < length; ++i )
users[i] = getUserByID( user_ids[i] );
intent.putExtra( USERS_IN_GROUP, users );
检索序列化的代码:
Bundle extra = intent.getExtras();
String action = intent.getAction();
if ( action.equals(IMService.JOIN_GROUP) )
{
//CLASS CAST EXCEPTION
UserInfo users[] = (UserInfo[]) extra.getSerializable( IMService.USERS_IN_GROUP );
}
这是错误:
问题
我知道我可能只是使用不同的数据结构,但我想理解为什么数组不可行,因为数组是可序列化的?
编辑: SnyersK能够获得更简单但类似的方案。 所以我尝试了同样的事情,我仍然得到同样的例外。在检索数组时,它将我的Tests数组转换为Object,这导致了转换异常。
我的测试对象:
package types;
import java.io.Serializable;
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private String hello = "hello";
}
传递Test对象数组的代码:
Test myArray[] = new Test[] { new Test(), new Test() };
Intent i = new Intent( this, Login.class );
i.putExtra( "key", myArray );
检索Test对象数组的代码:
Bundle extras = getIntent().getExtras();
Test array[] = (Test[]) extras.getSerializable( "key" ); //Class Cast Exception
答案 0 :(得分:12)
显然,这是旧版Android的错误。 (版本5.0.1是唯一经过测试的版本,它可以像预期的那样工作,也许它适用于5.0及以上版本)
错误
假设我们有一个名为User
的对象数组,它实现了Serializable
。
User[] users;
当我们尝试通过像这样的意图将此数组传递给另一个活动时
intent.putExtra("myKey", users);
我们的users
将转换为Object[]
。
如果我们尝试从第二个活动的意图中获取我们的数组,那么
User[] users = getIntent().getSerializableExtra("myKey");
我们将获得ClassCastException。
从文档中我们可以得出结论,这不应该是一个问题,因为Array
是一个可序列化的类,并且putExtra(String key, Serializable value)
已添加api 1
。
如果您希望在Android 5.0.1之前的Android版本上传递Array
(也许某些旧版本可以正常运行,但是直到Android 4.3,它仍然无效)
你必须解决它。您可以将Array
转换为ArrayList
。
修改强>
另一种解决方法是将额外内容复制到新数组,因此无需强制转换。我不确定该方法的积极/消极后果。它看起来像这样:
Object[] array = (Object[]) getIntent().getSerializableExtra("key");
User[] parsedArray = Arrays.copyOf(array, array.length, User[].class);
我在这里找到了这个方法:How to convert object array to string array in Java。
答案 1 :(得分:2)
替换
intent.putExtra( USERS_IN_GROUP, users );
与
intent.putExtra( USERS_IN_GROUP, new ArrayList<UserInfo>(Arrays.asList(users)));
答案 2 :(得分:0)
尝试这样:
Intent intent = new Intent( JOIN_GROUP ); //JOIN_GROUP is a constant string
String user_ids[] = packet.userIDs();
int length = user_ids.length;
UserInfo users[] = new UserInfo[length];
for ( int i = 0; i < length; ++i )
users[i] = getUserByID( user_ids[i] );
Bundle bnd=new Bundle();
bnd.putSerializable(USERS_IN_GROUP, users);
发送给你时附加到意图,而当你正在阅读时,你正在从捆绑中读取(这是额外的意图)。
答案 3 :(得分:0)
是UserInfo
内部类还是单独的java类文件?
如果它是内部类,那么父类也应该是Serializable。
如果没有,请使UserInfo
类实现Parcelable
并使用
intent.putParcelableArrayListExtra(USERS_IN_GROUP, new ArrayList<UserInfo>(Arrays.asList(users)));
答案 4 :(得分:-1)
没有putExtra(String name, Serializable[] value)
方法(注意 [] 括号)。只有putExtra(String name, Serializable value)
- 单个可序列化对象。
你应该试试Parcelable
- 意图可以携带额外的一个对象和数组