Как разбить объект на байт []? - PullRequest
3 голосов
/ 19 мая 2011

Как мне разбить объект --- 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.

Ответы [ 3 ]

4 голосов
/ 19 мая 2011

Ваш код выглядит в основном нормально.Я бы предложил следующее:

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;
}
1 голос
/ 19 мая 2011

В вопросе упоминается Parcelable, который не всегда сериализуем. Я думаю, что правильным подходом было бы написать Parcelable для Parcel. Затем используйте метод Parcel marshall () для записи необработанных байтов.

Я немного поиграл с этим. Если ваш Parcelable следует протоколу, следующий код записывает правильный байтовый массив для Parcelable. Предположим, что MyParcelable содержит 2 строки и одну целую.

            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();

Также см. Как использовать Parcel в Android?

0 голосов
/ 23 апреля 2018

Используйте библиотеку 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();
}
...