[Android]_[初级]_[发送广播时序列化报错]

Posted infoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Android]_[初级]_[发送广播时序列化报错]相关的知识,希望对你有一定的参考价值。

场景

  1. 在开发android应用时,有时候需要从工作线程或者Service发送Java对象到Activity, 那么如何发送?

  2. 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)

说明:

  1. 发送广播通过传入Intent对象,并调用sendBroadcast(intent);. 而存储自定义的对象,需要传递给Intent.putExtra方法:
public @NonNull Intent putExtra(String name, @Nullable Serializable value
public @NonNull Intent putExtra(String name, @Nullable Parcelable value)
  1. 两种类型android.os.Parcelablejava.io.Serializable都支持序列化和反序列化。其中ParcelableAndroid新增的类,并不是标准java库里的类,它并不是用于传统意义上的序列化和反序列化,比如持久化为XML对象,它的主要用途是让Parcel能用于在通讯(IPC等)时高性能的压缩和解压缩Parcelable对象。

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

  1. 而实现Serializable类,需要序列化的属性必须都是非static和非transient类型的。而其他属性必须是基本类型或者实现了Serializable的类,比如成员属性是Object类型就不能序列化,不然在序列化时会报错。如上所示错误。

参考

  1. Serializable (Java Platform SE 8 )

  2. Parcelable  |  Android Developers

  3. Parcel  |  Android Developers

以上是关于[Android]_[初级]_[发送广播时序列化报错]的主要内容,如果未能解决你的问题,请参考以下文章

[Android]_[初级]_[发送广播时序列化报错]

ANDROID_MARS学习笔记_S02_006_APPWIDGET3_AppWidget发送广播及更新AppWidget

android 蓝牙数据分包_Android 蓝牙广播数据包分析

Android08_广播接受者_服务

发送的广播数据报在Android中无法通过EACCES

[JavaWeb]_[初级]_[Jfinal使用时的常见错误]*持续更新*