1.Parcelable和Serializable有什么用,它们有什么差别?
2.自定义一个类让其实现Parcelable,大致流程是什么?
Parcelable和Serializable有什么用,有什么差别?
Parcelable和Serializable都可以实现序列化,使对象可以变为二进制流在内存中传输数据。Serizable和Parcelable接口可以完成对象的序列化过程,什么是序列化?序列化就是将对象的状态信息转换为可以存储或传输的形式的过程,在序列化期间,对象将其当前状态写入到临时或持久存储区,以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。而Serializable是java所提供的一个序列化接口,当然,Android中提供了新的序列化方式,那就是Parcelable接口,Parcelable接口只能在Android使用,使用较为稍微复杂一些。那两者有什么本质上的区别呢?
一.实现方式上
Serializable的使用只需实现Serializable接口就能使用,serialVersionUID也不是必须的(有它能减少反序列化失败),Parcelable不仅需要实现Parcelabel,还需要在类中添加一个静态成员变量CREATOP,这个变量需要实现Parcelable Creator接口。
二.效率上
serializable是java的序列化接口,使用起来简单但是开销大,序列化和反序列化需要大量I/O操作,而Pacelable是Android中的序列化方式,因此,更适合用在Android平台上,它的缺点是使用起来稍微麻烦点,但是效率高。
三.应用场景上
在将对象序列化到存储设备中或者将对象序列化后通过网络传输到其他设备,用Parcelable来实现的话会很复杂,建议使用Serializable,其他地方建议使用Parcelable;
2.自定义一个类让其实现Parcelable,大致流程是什么?
1.首先implements Parcelable
2.重写WriteToParcel,完成序列化功能,将当前对象写入序列化结构中
3.重写describeContents,完成内容描述功能,返回当前对象的内容描述,如果含有文件描述符,返回1,否则返回0,几乎所有情况返回0
4.实例化静态对象CREATOR,实现接口Parcelable,Creator<>,完成反序列化功能,其内部标明了如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程。
具体例子:
首先创建一个实现Parcelable接口的自定义类:
public class User implements Parcelable {
private String userName;
private boolean isMale;
protected User(Parcel in) {
userName = in.readString();
isMale = in.readByte() != 0;
}
public User(String userName,boolean isMale){
this.userName = userName;
this.isMale = isMale;
}
public String getUserName() {
return userName;
}
public boolean isMale() {
return isMale;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(userName);
parcel.writeInt(isMale ? 1:0);
}
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
在MainActivity:
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn_one);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
User myParcelable = new User("sdsds",false);
Bundle bundle = new Bundle();
bundle.putParcelable("value", myParcelable);
intent.putExtras(bundle);
startActivity(intent);
}
}
OtherActivity:
public class OtherActivity extends Activity {
private TextView text;
@Override
protected void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.activity_other);
text = (TextView)findViewById(R.id.text_one);
Bundle bundle = getIntent().getExtras();
User user = bundle.getParcelable("value");
text.setText(user.getUserName() +""+user.isMale()+"");
}
}
运行结果如下: