转自:https://www.cnblogs.com/duoshou/articles/8856111.html
前言:
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作二进制的转化,对写入和读取的顺序都要保持一致,对象越多实现越复杂。