当我使用 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 已经可以序列化了

【讨论】:

问题在于 ArrayList 正文而不是 hashmap 问题不在于 YouTubePlaylist 类,因为它已经是可序列化的。问题在于 HashMap&lt;String, List&lt;Item&gt;&gt; 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未标记为可序列化的位置

使构造函数仅接受 C# 中具有 [Serializable] 属性的对象

我的 GLSL 着色器程序链接正常,但是当我尝试使用它时出错——我该如何调试它?