[Android]_[初级]_[发送广播时序列化报错]
Posted infoworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Android]_[初级]_[发送广播时序列化报错]相关的知识,希望对你有一定的参考价值。
场景
-
在开发
android
应用时,有时候需要从工作线程或者Service
发送Java
对象到Activity
, 那么如何发送? -
在
Service
里通过方法sendBroadcast
发送广播到Activity
报错, 怎么回事?
/System.err: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.xxx.module.xxx.ModuleXXXManager$1)
W/System.err: at android.os.Parcel.writeSerializable(Parcel.java:2125)
at android.os.Parcel.writeValue(Parcel.java:1895)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:987)
说明:
- 发送广播通过传入
Intent
对象,并调用sendBroadcast(intent);
. 而存储自定义的对象,需要传递给Intent.putExtra
方法:
public @NonNull Intent putExtra(String name, @Nullable Serializable value
public @NonNull Intent putExtra(String name, @Nullable Parcelable value)
-
两种类型
android.os.Parcelable
和java.io.Serializable
都支持序列化和反序列化。其中Parcelable
是Android
新增的类,并不是标准java
库里的类,它并不是用于传统意义上的序列化和反序列化,比如持久化为XML
对象,它的主要用途是让Parcel
能用于在通讯(IPC
等)时高性能的压缩和解压缩Parcelable
对象。 -
Parcelable
对象是需要自己重载方法去写入需要压缩的属性值,如:
public class ContactUserData implements Parcelable
private String name = "";
private String phone = "";
public ContactUserData()
protected ContactUserData(Parcel in)
name = in.readString();
phone = in.readString();
public static final Creator<ContactUserData> CREATOR = new Creator<ContactUserData>()
@Override
public ContactUserData createFromParcel(Parcel in)
return new ContactUserData(in);
@Override
public ContactUserData[] newArray(int size)
return new ContactUserData[size];
;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getPhone()
return phone;
public void setPhone(String phone)
this.phone = phone;
@Override
public int describeContents()
return 0;
@Override
public void writeToParcel(Parcel parcel, int i)
parcel.writeString(name);
parcel.writeString(phone);
- 而实现
Serializable
类,需要序列化的属性必须都是非static
和非transient
类型的。而其他属性必须是基本类型或者实现了Serializable
的类,比如成员属性是Object
类型就不能序列化,不然在序列化时会报错。如上所示错误。
参考
以上是关于[Android]_[初级]_[发送广播时序列化报错]的主要内容,如果未能解决你的问题,请参考以下文章
ANDROID_MARS学习笔记_S02_006_APPWIDGET3_AppWidget发送广播及更新AppWidget