3

我如何破坏一个对象——更具体的 Parcelable;实际上它是一个捆绑包,但要点是相同的 --- 放入一个字节 []?我认为我这样做的方式是一个很好的解决方案,但显然我错了。

仅供参考,这是我以前的做法。

public static byte[] getBytes(Object obj) throws java.io.IOException {
    ByteArrayOutputStream bos   = new ByteArrayOutputStream();
    ObjectOutputStream oos      = new ObjectOutputStream(bos);
    oos.writeObject(obj);
    oos.flush();
    oos.close();
    bos.close();
    byte[] data = bos.toByteArray();
    return data;
}

谢谢~Aedon

编辑 1::

像这样将 Bundle 传递给它的对象会导致 NotSerializableException。

4

3 回答 3

4

您的代码看起来大部分都很好。我建议如下:

public static byte[] getBytes(Serializable obj) throws IOException {
    ByteArrayOutputStream bos   = new ByteArrayOutputStream();
    ObjectOutputStream oos      = new ObjectOutputStream(bos);
    oos.writeObject(obj);

    byte[] data = bos.toByteArray();

    oos.close();
    return data;
}
于 2011-05-18T23:54:35.163 回答
1

问题提到了 Parcelable,它并不总是可序列化的。我认为正确的方法是将 Parcelable 写入 Parcel。然后使用 Parcel 的 marshall() 方法写出原始字节。

我玩了一点。如果您的 Parcelable 遵循协议,则以下代码会为 Parcelable 写出正确的字节数组。假设 MyParcelable 包含 2 个字符串和 1 个 int。

            Parcel parcel1 = Parcel.obtain();
            MyParcelable parcelable1 = new MyParcelable("a", "b", 25);
            parcelable1.writeToParcel(parcel1, 0);

            byte content[] = parcel1.marshall();
            parcel1.recycle();
            Parcel parcel2 = Parcel.obtain();
            parcel2.unmarshall(content, 0, content.length);
            parcel2.setDataPosition(0);
            MyParcelable parcelable2 = MyParcelable.CREATOR.createFromParcel(parcel2);
            parcel2.recycle();
            Toast.makeText(context, parcelable2.a + " " + parcelable2.b + " " + parcelable2.val, Toast.LENGTH_LONG).show();

另请参阅如何在 Android 中使用 Parcel?

于 2011-05-19T01:19:12.560 回答
0

使用 Okio 库,它可以方便地替代 ByteArrayOutputStream 并具有更强大的 API。

public static byte[] getBytes(Serializable obj) throws IOException {
    Buffer buffer = new Buffer();
    ObjectOutputStream objectOut = new ObjectOutputStream(buffer.outputStream());
    objectOut.writeObject(obj);
    objectOut.close();
    return buffer.readByteArray();
}
于 2018-04-23T15:40:12.813 回答