Android开发篇之对象序列化
这里写图片描述什么是序列化?序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。而Serializable和Parcelable接口就可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。还有的时候我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端,这个时候也需要使用Serializable来完成对象的持久化。下面会分别来简单介绍一下Serializable和Parcelable接口的用法:
Serializable接口
- 实现序列化
public class User implements Serializable {
private static final long serialVersionUID = 8711368828010083044L;
private String Id;
private String Name;
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
(注:这里的serialVersionUID的值是手动指定,如果没有指定,则由编译器根据当前类的结构自动去生成它的hash值,这样序列化和反序列化时两者的serialVersionUID是相同的,因此可以正常进行反序列化。如果不手动指定serialVersionUID的值,反序列化时当前类有所改变,比如增加或者删除了某些成员变量,那么系统就会重新计算当前类的hash值并把它赋值给serialVersionUID,这个时候当前类的serialVersionUID就和序列化的数据中的serialVersionUID不一致,于是反序列化失败。)
- 对象序列化过程
User user = new User();
user.setId(editText1.getText().toString());
user.setName(editText2.getText().toString());
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(CacheDir + "cache.txt"));
out.writeObject(user); out.close();
} catch (IOException e) {
e.printStackTrace();
}
- 对象反序列化过程
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(CacheDir + "cache.txt"));
User user = (User)in.readObject();
editText1.setText(user.getId());
editText2.setText(user.getName());
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Parcelable接口
- 实现序列化
public class User implements Parcelable{
private String Id;
private String Name;
public User(){
Id = "";
Name = "";
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(Id);
out.writeString(Name);
//out.writeInt(number);
//out.writeInt(isBool?1:0);
//out.writeParcelable(obejct,0);
}
protected User(Parcel in) {
Id = in.readString();
Name = in.readString();
//isBool = in.readInt() == 1;
//object = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
}
- 对象序列化过程
User user = new User();
user.setId(editText1.getText().toString());
user.setName(editText2.getText().toString());
Intent intent = new Intent(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user",user);
intent.putExtras(bundle);
startActivity(intent);
- 对象反序列化过程
User user = (User) getIntent().getParcelableExtra("user");
Serializable与Parcelable的区别
Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此更适用于Android平台上,它的缺点就是使用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此在用于Intent间的数据传递时我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列号和到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程会稍微复杂,因此在这两种情况下建议大家使用Serializable。
序列化方式 | Intent间的数据传递 | 对象存储到存储设备 | 网络传输 |
---|---|---|---|
Serializable | ✔ | ✔ | |
Parcelable | ✔ |
网友评论