首先说Serializable,源自JavaSE,它是一种标识接口,继承它的类无须实现什么。Java会通过反射对其实现类进行高效的序列化操作,所以用着很简单。
缺点:既然是反射,那么它的过程就会较慢,这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
还有AIDL不支持Serializable。
而Parcelable是Android独有的,具体代码如下(有删简掉注释):
/**
* <p>典型使用案例:</p>
*
* <pre>
* public class MyParcelable implements Parcelable {
* private int mData;
*
* public int describeContents() {
* return 0;
* }
*
* public void writeToParcel(Parcel out, int flags) {
* out.writeInt(mData);
* }
*
* public static final Parcelable.Creator<MyParcelable> CREATOR
* = new Parcelable.Creator<MyParcelable>() {
* 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();
* }
* }</pre>
*/
public interface Parcelable {
public static final int PARCELABLE_WRITE_RETURN_VALUE = 0x0001;
public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
public int describeContents();
public void writeToParcel(Parcel dest, int flags);
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
public interface ClassLoaderCreator<T> extends Creator<T> {
public T createFromParcel(Parcel source, ClassLoader loader);
}
}
因为继承Parcelable的类清楚的写明了序列化过程,所以它很快,至少比Serializable快10倍。
但是同时它因为需要对象的代码高度优化,需要写大量的模板代码,使得对象代码变得难以阅读和维护。
还有一点必须要提:AIDL通讯时可以使用Parcelable对象。
为了效率和节省内存,多花点时间是值得的!
建议多使用Parcelable来实现序列化。
本文对比了Java中的Serializable接口与Android特有的Parcelable接口。Serializable通过反射实现序列化,简单但效率较低;而Parcelable则需要手动实现序列化逻辑,虽然复杂度增加,但提供了更高的效率和内存节省。
140

被折叠的 条评论
为什么被折叠?



