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++;
        }
    }
}