当我使用 Serializable 出错时,如何使用意图传递自定义对象列表
Posted
技术标签:
【中文标题】当我使用 Serializable 出错时,如何使用意图传递自定义对象列表【英文标题】:How to pass List of custom object using intent as I am getting error using Serializable 【发布时间】:2018-02-23 06:56:47 【问题描述】:我有一个对象列表,我想通过意图传递它。我也实现了 Serializable 但应用程序崩溃了。
public class YoutubePlaylist implements Serializable
@SerializedName("message")
@Expose
private String message;
@SerializedName("name")
@Expose
private String name;
@SerializedName("playlist_id")
@Expose
private String playlistId;
public String getMessage()
return message;
public void setMessage(String message)
this.message = message;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPlaylistId()
return playlistId;
public void setPlaylistId(String playlistId)
this.playlistId = playlistId;
我得到的错误是:
FATAL EXCEPTION: main
Process: com.osolutions.news24, PID: 28944
java.lang.RuntimeException: Parcel: unable to marshal value com.osolutions.news24.pojo.Item@7ffb401
at android.os.Parcel.writeValue(Parcel.java:1418)
at android.os.Parcel.writeList(Parcel.java:759)
at android.os.Parcel.writeValue(Parcel.java:1365)
at android.os.Parcel.writeMapInternal(Parcel.java:662)
at android.os.Parcel.writeMap(Parcel.java:646)
我在下面的课程中是这样传递的:
public class YoutubeHorizontalPlaylistAdapter extends RecyclerView.Adapter<YoutubeHorizontalPlaylistAdapter.ViewHolder>
private Context context;
private List<Item> itemList;
private ArrayList<YoutubePlaylist> body;
private HashMap<String, List<Item>> titleAndVideos;
public YoutubeHorizontalPlaylistAdapter(Context context,
List<Item> itemList ,List<YoutubePlaylist> body, HashMap<String, List<Item>> titleAndVideos)
this.context = context;
this.itemList = itemList;
this.body = (ArrayList<YoutubePlaylist>) body;
this.titleAndVideos = titleAndVideos;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_episode_item, null);
return new ViewHolder(v);
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBindViewHolder(final ViewHolder holder, final int position)
holder.episodeNameTxt.setText(itemList.get(position).getSnippet().getTitle());
String imagepath = itemList.get(position).getSnippet().getThumbnails().getHigh().getUrl();
UrlImageViewHelper.setUrlDrawable(holder.episodeImg, imagepath, R.drawable.placeholder_logo, 300000);
holder.itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
if (NetworkUtil.isOnline(context))
//
Bundle bundle = new Bundle();
bundle.putSerializable("title_body",body);
Intent i = new Intent(context, YoutubePlayListAdapter.class);
i.putExtra("hashmap", titleAndVideos);
i.putExtras(bundle);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
else
CustomAlertDialogManager.noInternetDialog(context);
);
@Override
public int getItemCount()
return itemList.size();
public static class ViewHolder extends RecyclerView.ViewHolder
View v;
private TextView episodeNameTxt;
ImageView episodeImg;
public ViewHolder(View itemView)
super(itemView);
episodeNameTxt = itemView.findViewById(R.id.episode_name);
episodeImg = itemView.findViewById(R.id.episode_img);
v = itemView;
注意:我在构造函数中对数组列表进行类型转换。我已经尝试过 Stack Overflow 的其他解决方案,但无法从中得到任何解决方案。
【问题讨论】:
您需要将模型类转换为 Parcelable 类 我试过这样做,但仍然是同样的错误 【参考方案1】:使您的 Item 类 Serializable 或 Parcelable。 让Item类实现java.io.Serializable接口,因为HashMap 已经可以序列化了
【讨论】:
问题在于 ArrayListHashMap<String, List<Item>> titleAndVideos;
,其中 Item 类不可序列化
在实现可序列化 java.lang.RuntimeException 后得到这个:Parcelable 遇到 IOException 写入可序列化对象
使用更新的 logcat 和相关代码编辑您的问题
谢谢,我也有一些内部类,并在那里实现了可序列化。现在工作正常:)【参考方案2】:
你需要转换Parcelable类而不是Serializable
转到这个http://www.parcelabler.com/ 并过去你的模型类并转换它。
更新模型类后 通过意图传递Parcelable List
Intent i = new Intent(context, YoutubePlayListAdapter.class);
i.putExtra("hashmap", titleAndVideos);
i.putParcelableArrayListExtra("title_body", body);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i);
在YoutubePlayListAdapter Activity中可以通过
ArrayList<YoutubePlaylist> mList = getIntent().getParcelableArrayListExtra("title_body");
【讨论】:
以上是关于当我使用 Serializable 出错时,如何使用意图传递自定义对象列表的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我使用hibernate时这个类应该实现java.io.Serializable?
如何识别c__DisplayClass未标记为可序列化的位置