对象序列化传递 Serializable 和Parcelable

序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作,与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。

  • Serializable

    1. Serializable序列化不保存静态变量,另外使用Transient关键字可声明对指定字段不做序列化。

    2.由于Serializable方式使用了反射机制,使得序列化的过程相对较慢。并且,这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。

    3.Serializable可将数据持久化方便保存,所以在需要保存文件或网络传输数据时应选择Serializable。

public class SData implements Serializable{

    public int age;
    public String name;
    public Boolean sex;
    public double height;
}
  • Parcelable

    1.Parcelable数据仅在内存中存在,所以在内存间数据传输时推荐使用

    2.采用Parcelable方式的类,需要自己定义如何打包(写数据)和解包(读数据),其余的序列化操作则由底层实现。具体需要实现的方法如下:
    <1>writeToParcel(Parcel out, int flags) : 写数据
    <2>Parcelable.Creator<类名> CREATOR : 例行公事实现createFromParcel(读数据)和newArray
    <3>describeContents : 返回0即可

public class PDate implements Parcelable {
    public int age;
    public String name;
    public Boolean sex;
    public double height;

    public static final Creator<PDate> CREATOR = new Creator<PDate>() {
     // 读数据  
        @Override
        public PDate createFromParcel(Parcel in) {
            PDate pDate=new PDate();
            pDate.age=in.readInt();
            pDate.name=in.readString();
            pDate.sex=in.readByte()!=0;
            pDate.height=in.readDouble();
            return pDate;
        }

        @Override
        public PDate[] newArray(int size) {
            return new PDate[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }
    // 写数据
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeDouble(height);
        dest.writeByte((byte) (sex ? 1 : 0));
    }
}

Parcelable暂不支持直接操作布尔boolean类型,但能间接通过设置byte位来实现boolean类型的参数传递。

  • 下面是数据的传递代码

    MainActivity

public class MainActivity extends Activity implements View.OnClickListener {
    public Button button1, button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = (Button) findViewById(R.id.SDate);
        button2 = (Button) findViewById(R.id.PDate);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.SDate:
                SData sData = new SData();
                sData.age = 22;
                sData.name = "bingge";
                sData.sex = true;
                sData.height = 18.5;
                Intent intent = new Intent(this, Serializable_Activity.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("people", sData);
                intent.putExtras(bundle);
                startActivity(intent);
                break;
            case R.id.PDate:
                PDate pDate = new PDate();
                pDate.age = 18;
                pDate.name = "lihong";
                pDate.sex = false;
                pDate.height = 16.5;
                Intent intent2 = new Intent(this, Pacelable_Activity.class);
                Bundle bundle2 = new Bundle();
                bundle2.putParcelable("hong", pDate);
                intent2.putExtras(bundle2);
                startActivity(intent2);
                break;
            default:
        }
    }
}

Serializable_Activity接收数据

public class Serializable_Activity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.serializable_layout);
        Bundle bundle = getIntent().getExtras();
        SData sData = (SData) bundle.getSerializable("people");
        String daye = sData.age + "";
        String daye2 = sData.name;
        String daye3 = sData.sex + "";
        String daye4 = sData.height + "";
        System.out.println("shuju:" + daye + daye2 + daye3 + daye4);
    }
}

Pacelable_Activity接收数据

public class Pacelable_Activity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parcelable_layout);
        Bundle bundle = getIntent().getExtras();
        PDate pDate = bundle.getParcelable("hong");
        String daye= pDate.age+"";
        String daye2= pDate.name;
        String daye3= pDate.sex+"";
        String daye4= pDate.height+"";
        System.out.println("shuju:"+daye+daye2+daye3+daye4);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值