Android 序列化(Serializable和Parcelable)

private int mData;

public int describeContents() {

return 0;

}

public void writeToParcel(Parcel out, int flags) {

out.writeInt(mData);

}

public static final Parcelable.Creator CREATOR

= new Parcelable.Creator() {

public MyParcelable createFromParcel(Parcel in) {

return new MyParcelable(in);

}

public MyParcelable[] newArray(int size) {

return new MyParcelable[size];

}

};

private MyParcelable(Parcel in) {

mData = in.readInt();

}

}

此时Android Studio 给我们了一个插件可自动生成Parcelable 。

🔥 自动生成 Parcelable

==================

public class User {

String name;

int ag
e;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

想进行序列化,但是自己写太麻烦了,这里介绍个插件操作简单易上手。

💥 先下载


💥 使用


💥 效果


public class User implements Parcelable {

String name;

int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(this.name);

dest.writeInt(this.age);

}

public void readFromParcel(Parcel source) {

this.name = source.readString();

this.age = source.readInt();

}

public User() {

}

protected User(Parcel in) {

this.name = in.readString();

this.age = in.readInt();

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

@Override

public User createFromParcel(Parcel source) {

return new User(source);

}

@Override

public User[] newArray(int size) {

return new User[size];

}

};

}

搞定。

写完了咱就运行走一波。

🔥 使用实例

=======

💥 Serializable


MainActivity.class

Bundle bundle = new Bundle();

UserSerializable userSerializable=new UserSerializable(“SCC”,15);

bundle.putSerializable(“user”,userSerializable);

Intent intent = new Intent(MainActivity.this, BunderActivity.class);

intent.putExtra(“user”,bundle);

startActivity(intent);

BunderActivity.class

Bundle bundle = getIntent().getBundleExtra(“user”);

UserSerializable userSerializable= (UserSerializable) bundle.getSerializable(“user”);

MLog.e(“Serializable:”+userSerializable.name+userSerializable.age);

日志:

2021-10-25 E/-SCC-: Serializable:SCC15

💥 Parcelable


MainActivity.class

Bundle bundle = new Bundle();

bundle.putParcelable(“user”,new UserParcelable(“SCC”,15));

Intent intent = new Intent(MainActivity.this, BunderActivity.class);

intent.putExtra(“user”,bundle);

startActivity(intent);

BunderActivity.class

Bundle bundle = getIntent().getBundleExtra(“user”);

UserParcelable userParcelable= (UserParcelable) bundle.getParcelable(“user”);

MLog.e(“Parcelable:”+userParcelable.getName()+userParcelable.getAge());

日志:

2021-10-25 E/-SCC-: Parcelable:SCC15

🔥 Parcelable 中使用泛型

===================

💥 UserParcelable


public class UserParcelable implements Parcelable {

private String name;

private int age;

private T data;

//…set/get部分省略

public T getData() {

return data;

}

public void setData(T data) {

this.data = data;

}

public UserParcelable(String name, int age, T data) {

this.name = name;

this.age = age;

this.data = data;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(this.name);

dest.writeInt(this.age);

//这里:先保存这个泛型的类名

dest.writeString(data.getClass().getName());

dest.writeParcelable(this.data, flags);

}

public void readFromParcel(Parcel source) {

this.name = source.readString();

this.age = source.readInt();

//这里

String dataName = source.readString();

try {

this.data = source.readParcelable(Class.forName(dataName).getClassLoader());

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

protected UserParcelable(Parcel in) {

this.name = in.readString();

this.age = in.readInt();

//这里

String dataName = in.readString();

try {

this.data = in.readParcelable(Class.forName(dataName).getClassLoader());

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

public static final Creator CREATOR = new Creator() {

@Override

public UserParcelable createFromParcel(Parcel source) {

return new UserParcelable(source);

}

@Override

public UserParcelable[] newArray(int size) {

return new UserParcelable[size];

}

};

}

💥 Tman


public class Tman implements Parcelable {

String color;

public Tman(String color) {

this.color = color;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(this.color);

}

public void readFromParcel(Parcel source) {

this.color = source.readString();

}

protected Tman(Parcel in) {

this.color = in.readString();

}

public static final Creator CREATOR = new Creator() {

@Override

public Tman createFromParcel(Parcel source) {

return new Tman(source);

}

@Override

public Tman[] newArray(int size) {

return new Tman[size];

}

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
}

protected Tman(Parcel in) {

this.color = in.readString();

}

public static final Creator CREATOR = new Creator() {

@Override

public Tman createFromParcel(Parcel source) {

return new Tman(source);

}

@Override

public Tman[] newArray(int size) {

return new Tman[size];

}

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-OspAEMJ2-1718823465121)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值