Как сериализовать растровое изображение в Android

#java #android #serializable #android-bitmap

#java #Android #сериализуемый #android-растровое изображение

Вопрос:

Я пытаюсь сохранить состояние списка объектов. И одно из полей в классе object является растровым изображением. И поскольку Bitmap не является сериализуемым, я реализовал свой собственный класс bitmap, который реализует Serializable. Я рассмотрел другие вопросы, чтобы создать этот класс, и, похоже, он должен работать. Но когда я запускаю приложение, оно выходит из строя сразу после выполнения метода writeObject в моем классе serializableBitmap. Но когда он выходит из строя, это не говорит о том, что он, к сожалению, перестал работать, а просто возвращается на главный экран. Он также не выводит никаких сообщений об ошибках в LogCat. Поэтому я понятия не имею, что вызывает сбой. Вот мой класс serializableBitmap:

 public class serializableBitmap implements Serializable {


private static final long serialVersionUID = -5228835919664263905L;
private Bitmap bitmap; 

public serializableBitmap(Bitmap b) {
    bitmap = b; 
}

// Converts the Bitmap into a byte array for serialization
private void writeObject(ObjectOutputStream out) throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream);
    byte bitmapBytes[] = byteStream.toByteArray();
    if (success)
    out.write(bitmapBytes, 0, bitmapBytes.length);
}

// Deserializes a byte array representing the Bitmap and decodes it
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    int b;
    while((b = in.read()) != -1)
        byteStream.write(b);
    byte bitmapBytes[] = byteStream.toByteArray();
    bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
}

public Bitmap getBitmap() {
    return this.bitmap;
}

}
 

Любая помощь была бы очень признательна.

О, и в моем классе объектов, который содержит растровое изображение, я реализую Parcelable, а затем в методе writeToParcel, который я вызываю

 dest.writeList(bitmaps);
 

А растровые изображения — это

 private ArrayList<serializableBitmap> bitmaps; 
 

Комментарии:

1. В методе сжатия у вас установлено нулевое качество. Это не может быть хорошо.

2. Вы можете сохранить переменную состояния, а затем перезагрузить растровое изображение, соответствующее этому числу.

Ответ №1:

У меня была такая же проблема для больших растровых изображений. Растровые изображения меньшего размера (около 500 x 300 пикселей) работали просто отлично.

Старайтесь избегать сериализации больших растровых изображений и вместо этого загружайте их там, где они необходимы. Вы могли бы, например, сериализовать их URL-адреса и загрузить их позже или записать их в локальное хранилище.