当前位置: 首页 > 知识库问答 >
问题:

将序列化数组从一个活动传递到另一个活动时出现类转换异常

公冶经纶
2023-03-14

我有一个包含可序列化对象的数组,并试图使用Intent的putExtra()和Bundle的getSerializable()。然而,我得到了一个类转换异常,我不明白为什么。

下面是代码。用户信息是我自己的类,它实现了可序列化,并且我已经能够在活动之间传递单个用户信息对象。我只在尝试使用数组时遇到此问题。

发送可序列化的代码:

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能够获得更简单但类似的工作方案。所以我尝试了同样的事情,我仍然得到同样的例外。它在检索数组时将我的测试数组转换为对象,从而导致转换异常。

我的测试对象:

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

检索测试对象数组的代码:

Bundle extras = getIntent().getExtras();
Test array[] = (Test[]) extras.getSerializable( "key" ); //Class Cast Exception

共有3个答案

蓬弘
2023-03-14

像这样试试:

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

发送时,你附加到意图,而返回时,你从捆绑中读取(这是额外的意图)。

索寒
2023-03-14

替换

intent.putExtra( USERS_IN_GROUP, users );

随着

intent.putExtra( USERS_IN_GROUP, new ArrayList<UserInfo>(Arrays.asList(users)));
罗淮晨
2023-03-14

显然这是老版本Android的一个bug。(版本5.0.1是唯一一个测试过的版本,它可以像预期的那样工作,也许它可以从5.0开始工作)

错误

假设我们有一个名为 User 的对象的数组,它实现了可序列化

User[] users;

当我们尝试通过这样的意图将此数组传递给另一个活动时

intent.putExtra("myKey", users);

我们的< code >用户将被转换为< code >对象[]。

如果我们像这样尝试从第二个活动的意图中获取数组

User[] users = getIntent().getSerializableExtra("myKey");

我们将得到一个ClassCastException。

从文档中,我们可以得出结论,这应该不是问题,因为 Array 是一个可序列化的类,并且 putExtra(字符串键,可序列化值)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);

我在这里找到了这个方法:如何在Java中将对象数组转换为字符串数组。

 类似资料:
  • 我尝试使用 如有任何帮助,不胜感激,谢谢。

  • 我想把意图转移到Xamarin.Android中的另一个活动。基本上,我需要Intent.data和Intent.clipdata到另一个活动,所以我使用下面的代码来传输Intent,但我不知道检索它的正确方法。 下面是Main Activity中的代码 在第二活动中 如何在第二个活动中检索意图?

  • 在SO上也有类似的问题,但没有一个对我有效。 我想在Activity1中获取被点击的图像并在Activity2中显示它。 我获取被点击图像的图像id如下所示: 并通过意图传递给另一个活动。 任何帮助都很感激。

  • Activity-2(将所选图像设置为屏幕背景图像的活动)

  • 在活动1中,我将一张图片从url加载到imageview中(使用glide)。当我切换到活动2时,我断开了网络连接,我需要在另一个imageview中加载相同的图像。我该如何实现这一点?使用glide缓存在某处的图像可以做到这一点吗?

  • 我正在使用解析网站。 我在中有一个。 并且我需要将值传递给。 所以我创建了一个类实现。 但是,我在类中得到了一个。 如何将传递给另一个活动?