博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
序列化Serializable和Parcelable的区别
阅读量:4080 次
发布时间:2019-05-25

本文共 5180 字,大约阅读时间需要 17 分钟。

Android中Intent如果要传递类对象,可以通过两种方式实现。

方式一:Serializable,要传递的类实现Serializable接口传递对象,

方式二:Parcelable,要传递的类实现Parcelable接口传递对象。

Serializable(Java自带):

Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。Serializable是一种标记接口,这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。

Parcelable(Android 专用):

Android的Parcelable的设计初衷是因为Serializable效率过慢(使用反射),为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在。Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。

效率及选择:

Parcelable的性能比Serializable好,因为后者在反射过程频繁GC,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据。而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。 Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

通过intent传递复杂数据类型时必须先实现两个接口之一,对应方法分别是getSerializableExtra(),getParcelableExtra()。

利用java自带的Serializable 进行序列化:

public class Person implements Serializable{
private static final long serialVersionUID = 7362356359068556080L; private String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; }}

在activity中:

public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.mTv).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); Person person = new Person(); person.setName("大家好"); person.setAge(20); // public Intent putExtra(String name, Serializable value) intent .putExtra("person_test", person); startActivity(intent); } }); }}
public class SecondActivity extends Activity{
private TextView mTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); mTv = (TextView) findViewById(R.id.mTv); Intent intent = getIntent(); // 关键方法:getSerializableExtra ,我们的类是实现了Serializable接口的,所以写这个方法获得对象 Person person = (Person)intent.getSerializableExtra("person_test"); mTv.setText("名字:"+person .getName()+"==="+"年龄:"+person .getAge()); }}

Android专用的Parcelable的序列化:

public class Pen implements Parcelable{
private String color; private int size; // 系统自动添加,给createFromParcel里面用 protected Pen(Parcel in) { color = in.readString(); size = in.readInt(); } public static final Creator
CREATOR = new Creator
() { /** * * @param in * @return * createFromParcel()方法中我们要去读取刚才写出的name和age字段, * 并创建一个Person对象进行返回,其中color和size都是调用Parcel的readXxx()方法读取到的, * 注意这里读取的顺序一定要和刚才写出的顺序完全相同。 */ @Override public Pen createFromParcel(Parcel in) { return new Pen(in); // 在构造函数里面完成了 读取 的工作 } //供反序列化本类数组时调用的 @Override public Pen[] newArray(int size) { return new Pen[size]; } }; @Override public int describeContents() { return 0; // 内容接口描述,默认返回0即可。 } // 读数据进行恢复 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(color); dest.writeInt(size); } public Pen() { } public Pen(String color, int size) { this.color = color; this.size = size; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getSize() { return size; } public void setSize(int size) { this.size = size; }}

在activity中:

public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 采用Parcelable的方式 findViewById(R.id.mTv).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,ThirdActivity.class); Pen pen = new Pen(); pen .setColor("red"); pen .setSize(8); // public Intent putExtra(String name, Parcelable value) intent .putExtra("pen_test",pen ); startActivity(intent); } }); }}
public class ThirdActivity extends Activity{
private TextView mTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); Pen pen = (Pen)getIntent().getParcelableExtra("pen_test"); mTv = (TextView) findViewById(R.id.mTv); mTv .setText("颜色:"+pen.getColor()+"==="+"大小:"+pen.getSize()); }}

转载地址:http://mzsni.baihongyu.com/

你可能感兴趣的文章
弄ROS可以不用装双系统或者买一台电脑啥的, 可以直接U盘启动
查看>>
现在智能车赛开始用ROS和SLAM了!
查看>>
gazebo是可以仿真PX4的
查看>>
我印象中记得protues仿真和真实是有些地方有差异的
查看>>
你得把一个东西玩烂,别人才会给你机会做那方面的开发
查看>>
PX4中的offboard模式能够接受来自外部的控制指令,搭配机载或支持MAVROS的协同计算机,可在PX4飞控平台上加入视觉处理或人工智能,以实现无人机自动控制功能。
查看>>
使用 GAAS 快速的搭建 Gazebo 仿真模拟器,并且使用 Offboard 控制无人机飞行。
查看>>
[PX4]mavros安装+offboard控制过程记录
查看>>
我现在可以感受到 PX4+gazebo+MAVROS+offboard是标配。看来很多人已经这么做了
查看>>
Drone就是无人机的意思
查看>>
发现一个新的讲APM飞控二次开发的课
查看>>
多做(题/项目)
查看>>
Pixhawk指示灯和蜂鸣器含义
查看>>
Pixhawk指示灯介绍
查看>>
Ardupilot 似乎就是APM
查看>>
我在华清的嵌入式课程笔记(至2020.7.5)
查看>>
现在TB上很多提供SMT贴片服务了,可能就不用自己手工贴片了。
查看>>
APM(pixhawk)飞控疑难杂症解决方法汇总
查看>>
记一次pixhawk烧写了他们给的固件后就连不上地面站
查看>>
飞控板的供电方案
查看>>