0

にパラメーターがあり、それをシリアル化SparseArray<int[]>したい。

しかし、writeSparseArray(Object)for Parcelable はサポートしていないようint[]です。をシリアル化する他の方法はありますか、またはオブジェクトにSparseArray<int[]>変更するだけですか?int[]

4

1 に答える 1

2

私は Parcel.writeSparseArray() メソッドをチェックしましたが、私の意見では、このメソッドは writeList() のようにジェネリックである必要があるため、いくつかの問題があります。次のようになります。

public final void writeSparseArray(SparseArray<Object> val)

そしてあるべきです

public final void writeSparseArray(SparseArray<? extends Object> val)

また

public final <T> void writeSparseArray(SparseArray<T> val)

また

public final void writeSparseArray(SparseArray val)

そのため、SparseArray オブジェクトに対してこのメ​​ソッドの独自の実装を実装する必要があります。それが最善の解決策であるかどうかはわかりませんが、これを試すことができます:

public void writeSparseArray(Parcel dest, SparseArray<int[]> sparseArray) {
    if (sparseArray == null) {
        dest.writeInt(-1);
        return;
    }
    int size = sparseArray.size();
    dest.writeInt(size);
    int i=0;
    while (i < size) {
        dest.writeInt(sparseArray.keyAt(i));
        dest.writeIntArray(sparseArray.valueAt(i));
        i++;
    }
}

private SparseArray<int[]> readSparseArrayFromParcel(Parcel source){
    int size = source.readInt();
    if (size < 0) {
        return null;
    }
    SparseArray sa = new SparseArray(size);
    while (size > 0) {
        int key = source.readInt();
        int[] value = source.createIntArray();
        sa.put(key, value);
        size--;
    }
    return sa;
}
于 2015-01-12T08:36:50.873 に答える