前言:

Serializable和Parcelable能够将对象序列化,使之能够在一些特殊场景中进行传输,再进行数据的恢复(Serializable是Java实现的接口,而Parcelable是Android实现的)。

两者作用类似但是实现等其他方面有较大区别,比较多的说法认为Parcelable不适合用于数据的持久化保存,但合适与否和是否可行完全是两码事(GSON是另外一种保存对象的方式)。

出于好奇想从性能方面比较两者持久化的异同。

 

一.Serializable

需要实现的类如下

class SerialData implements Serializable {

    private static final long serialVersionUID = -7060210544622464481L;

    public ArrayList<String> array;

    public SerialData() {
        array = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            array.add(new String("123"));
        }
    }
}

写方法

private void saveAsSerializable(SerialData data) {
        FileOutputStream fos;
        ObjectOutputStream oos;
        try {
            fos = getApplicationContext().openFileOutput(TAG,
                    Context.MODE_PRIVATE);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(data);
            oos.close();
            fos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

读方法

private SerialData readData() {
        SerialData obj = null;
        FileInputStream fis;
        ObjectInputStream ois;
        try {
            fis = getApplicationContext().openFileInput(TAG);
            ois = new ObjectInputStream(fis);
            obj = (SerialData) ois.readObject();
            ois.close();
            fis.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (obj != null)
            return obj;
        else
            return null;

    }

二.Parcelable

实现类

class ParceData implements Parcelable {
    public ArrayList<String> array;

    public ParceData() {
        array = new ArrayList<String>();
        for (int i = 0; i < 100000; i++) {
            array.add(new String("123"));
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeStringList(array);
    }

    public static final Parcelable.Creator<ParceData> CREATOR = new Creator<ParceData>() {
        @Override
        public ParceData[] newArray(int size) {
            return new ParceData[size];
        }

        @Override
        public ParceData createFromParcel(Parcel in) {
            return new ParceData(in);
        }
    };

    public ParceData(Parcel in) {
        array = new ArrayList<String>();
        in.readStringList(array);
    }
}

写方法

protected void saveParce() {
        FileOutputStream fos;
        try {
            fos = getApplicationContext().openFileOutput(TAG,
                    Context.MODE_PRIVATE);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            Parcel parcel = Parcel.obtain();
            parcel.writeParcelable(new ParceData(), 0);

            bos.write(parcel.marshall());
            bos.flush();
            bos.close();
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

读方法

protected void loadParce() {
        FileInputStream fis;
        try {
            fis = getApplicationContext().openFileInput(TAG);
            byte[] bytes = new byte[fis.available()];
            fis.read(bytes);
            Parcel parcel = Parcel.obtain();
            parcel.unmarshall(bytes, 0, bytes.length);
            parcel.setDataPosition(0);

            ParceData data = parcel.readParcelable(ParceData.class.getClassLoader());
            fis.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

三.速度比较

1.Serializable

执行如下操作:

SerialData data = new SerialData();
Log.e("time", "befor = " + System.currentTimeMillis());
saveAsSerializable(data);
Log.e("time", "after = " + System.currentTimeMillis());

10次平均:2889ms

 

2.Parcelable

操作如下:

Log.e("time", "befor = " + System.currentTimeMillis());
saveParce();
Log.e("time", "after = " + System.currentTimeMillis());

 

10次平均:360ms

 

四.内存比较

初始状态:

 

 

执行一次Serializable的写入

执行一次Parcelable的写入

 

 

 

Pacelable在速度上,内存的使用上都比Serializable有优势。虽然如此,实际上面的数据并没有太大的参考意义,两个类都创建了10万个对象,项目中这种情况很少遇到。

实现起来Serializable更简单,实现接口即可,而Pacelable作二进制的转化,对写入和读取的顺序都要保持一致,对象越多实现越复杂。