Serializable
ช้าอย่างตลกขบขันบน Android เส้นขอบไร้ประโยชน์ในหลาย ๆ กรณีในความเป็นจริง
Parcel
และParcelable
รวดเร็วอย่างน่าอัศจรรย์ แต่เอกสารระบุว่าคุณต้องไม่ใช้เพื่อการจัดลำดับตามวัตถุประสงค์ทั่วไปในการจัดเก็บเนื่องจากการใช้งานจะแตกต่างกันไปตาม Android เวอร์ชันต่างๆ (เช่นการอัปเดตระบบปฏิบัติการอาจทำให้แอปที่ต้องใช้งานไม่ได้)
ทางออกที่ดีที่สุดสำหรับปัญหาในการจัดลำดับข้อมูลไปยังหน่วยเก็บข้อมูลด้วยความเร็วที่เหมาะสมคือการม้วนข้อมูลของคุณเอง โดยส่วนตัวแล้วฉันใช้หนึ่งในคลาสยูทิลิตี้ของฉันเองซึ่งมีอินเทอร์เฟซที่คล้ายกันParcel
และสามารถทำให้เป็นอนุกรมมาตรฐานทุกประเภทได้อย่างมีประสิทธิภาพ (โดยเสียค่าใช้จ่ายของประเภทความปลอดภัย) นี่คือเวอร์ชันย่อของมัน:
public interface Packageable {
public void readFromPackage(PackageInputStream in) throws IOException ;
public void writeToPackage(PackageOutputStream out) throws IOException ;
}
public final class PackageInputStream {
private DataInputStream input;
public PackageInputStream(InputStream in) {
input = new DataInputStream(new BufferedInputStream(in));
}
public void close() throws IOException {
if (input != null) {
input.close();
input = null;
}
}
public final int readInt() throws IOException {
return input.readInt();
}
public final long readLong() throws IOException {
return input.readLong();
}
public final long[] readLongArray() throws IOException {
int c = input.readInt();
if (c == -1) {
return null;
}
long[] a = new long[c];
for (int i=0 ; i<c ; i++) {
a[i] = input.readLong();
}
return a;
}
...
public final String readString() throws IOException {
return input.readUTF();
}
public final <T extends Packageable> ArrayList<T> readPackageableList(Class<T> clazz) throws IOException {
int N = readInt();
if (N == -1) {
return null;
}
ArrayList<T> list = new ArrayList<T>();
while (N>0) {
try {
T item = (T) clazz.newInstance();
item.readFromPackage(this);
list.add(item);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
N--;
}
return list;
}
}
public final class PackageOutputStream {
private DataOutputStream output;
public PackageOutputStream(OutputStream out) {
output = new DataOutputStream(new BufferedOutputStream(out));
}
public void close() throws IOException {
if (output != null) {
output.close();
output = null;
}
}
public final void writeInt(int val) throws IOException {
output.writeInt(val);
}
public final void writeLong(long val) throws IOException {
output.writeLong(val);
}
public final void writeLongArray(long[] val) throws IOException {
if (val == null) {
writeInt(-1);
return;
}
writeInt(val.length);
for (int i=0 ; i<val.length ; i++) {
output.writeLong(val[i]);
}
}
public final void writeFloat(float val) throws IOException {
output.writeFloat(val);
}
public final void writeDouble(double val) throws IOException {
output.writeDouble(val);
}
public final void writeString(String val) throws IOException {
if (val == null) {
output.writeUTF("");
return;
}
output.writeUTF(val);
}
public final <T extends Packageable> void writePackageableList(ArrayList<T> val) throws IOException {
if (val == null) {
writeInt(-1);
return;
}
int N = val.size();
int i=0;
writeInt(N);
while (i < N) {
Packageable item = val.get(i);
item.writeToPackage(this);
i++;
}
}
}