序列化,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
1.优劣
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。
Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。使用了反射,序列化的过程较慢
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。
Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下,不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable 。
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了
Parcelable的持久化存储是不稳定的,它会随着系统版本的不同而变化
2.使用
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可
Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现
例如:
public class NewAddrIndia implements Parcelable {
//tag = 1
@SerializedName("addr")
publicStringaddr;
//tag = 2
@SerializedName("landmark")
publicStringlandmark;
//tag = 3
@SerializedName("city")
publicStringcity;
public static NewAddrIndia decode(byte[] bytes) throws IOException {
BufferedSource source =newBuffer().write(bytes);
ProtoReader reader =newProtoReader(source);
returndecode(reader);
}
public static NewAddrIndia decode(ProtoReader reader)throwsIOException {
NewAddrIndia result =newNewAddrIndia();
longtoken = reader.beginMessage();
for(inttag; (tag = reader.nextTag()) != -1; ) {
switch(tag) {
case1:
result.addr= ProtoAdapter.STRING.decode(reader);
break;
case2:
result.landmark= ProtoAdapter.STRING.decode(reader);
break;
case3:
result.city= ProtoAdapter.STRING.decode(reader);
break;
default:
reader.peekFieldEncoding().rawProtoAdapter().decode(reader);
break;
}
}
reader.endMessage(token);
returnresult;
}
@Override
public intdescribeContents() {
return0;
}
@Override
public void writeToParcel(Parcel dest,intflags) {
dest.writeString(this.addr);
dest.writeString(this.landmark);
dest.writeString(this.city);
}
public NewAddrIndia() {
}
protected NewAddrIndia(Parcel in) {
this.addr= in.readString();
this.landmark= in.readString();
this.city= in.readString();
}
public static final CreatorCREATOR=newCreator() {
@Override
public NewAddrIndia createFromParcel(Parcel source) {
return newNewAddrIndia(source);
}
@Override
public NewAddrIndia[] newArray(intsize) {
return newNewAddrIndia[size];
}
};
}
网友评论