Problema serializable de Android

He creado una clase, que tiene varias variables miembro, todos los cuales son serializable … excepto un mapa de bits! He intentado extender bitmap e implementar serializable, no pensar Bitmap es una clase final.

Quiero guardar la clase (que básicamente forma el estado actual de un juego) para que un jugador pueda recoger y cargar el juego.

La manera que lo veo tengo dos opciones: 1) Encuentre otra manera de ahorrar el estado del juego. Cualquier ayuda aquí sería apreciada.

2) cambiar la variable miembro de mapa de bits a un int, por ejemplo, y crear una clase BitmapGetter que tiene un método estático devolver bitmaps basado en ints. (Esta opción no es fácil, ya que mi clase contiene tantas posibilidades de mapa de bits y la forma en que creé el juego significa que esto requerirá una increíble cantidad de esfuerzo.

Básicamente no tengo a nadie a quien culpar pero a mí mismo por perezosamente crear una variable de mapa de bits sin pensar, pero agradecería cualquier ayuda …

¿Cómo sobre la sustitución de Bitmap con una clase como esta:

public class SerialBitmap implements Serializable { public Bitmap bitmap; // TODO: Finish this constructor SerialBitmap(<some params>) { // Take your existing call to BitmapFactory and put it here bitmap = BitmapFactory.decodeSomething(<some params>); } // Converts the Bitmap into a byte array for serialization private void writeObject(java.io.ObjectOutputStream out) throws IOException { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteStream); byte bitmapBytes[] = byteStream.toByteArray(); out.write(bitmapBytes, 0, bitmapBytes.length); } // Deserializes a byte array representing the Bitmap and decodes it private void readObject(java.io.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); } } 

Los métodos Serializable.writeObject () y readObject () sobreescritos serializan los bytes en lugar del Bitmap para que la clase sea serializable. Tendrás que terminar el constructor porque no sé cómo construyes actualmente tu Bitmap. Lo último que hay que hacer es reemplazar referencias a YourClass.bitmap con YourClass.serialBitmap.bitmap.

¡Buena suerte!

Barry PS Este código compila pero no lo he probado con un mapa de bits real

Yo tuve el mismo problema.

Y decidí como esto.

Bitmap es Parcelable , así que hice seguir a mi clase.

  1. Hice Constructor que obtiene el objeto Bundle y getter que devuelve Bundle que representa datos de objetos. Así que mientras Bitmap es parcelable , Bundle puede guardar bitmap como parcelable en él.

  2. Cuando necesite pasar Date in intent, puede llamar al método getBundle() objetos y pasarlo con Intent.putExtra(String key,Bundle value)

  3. En la actividad de destino llamará a getBundle(String key) y lo pasará al constructor .

    Creo que es un enfoque muy fácil.

En primer lugar, debe serializar a través de Parcelable . Es una clase de Android y por lo general funciona muy bien, fuera de la caja: y puede serializar un ByteArray con él, con los métodos:

 public final void writeByteArray (byte[] b) 

y

 public final void readByteArray (byte[] val) 

Es posible que desee comprobar la documentación de la parcela también.

Puede realizar la serialización manualmente utilizando los siguientes métodos java:

 private void writeObject(java.io.ObjectOutputStream out) private void readObject(java.io.ObjectInputStream in) 

Serialice el mapa de bits utilizando getPixels y cuando realice la deserialización puede utilizar createBitmap para recrearlo desde cero.

Puede leer acerca de cómo usar readObject y writeObject aquí: http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html

Si está bien guardar los datos de mapa de bits por separado en su aplicación, puede hacer lo siguiente:

En su clase que guarda el estado actual, guarde el mapa de bits en una carpeta de su elección:

 FileOutputStream out = new FileOutputStream(<path to bmp>); bitmap.compress(CompressFormat.PNG, 100, out); 

En la clase que tiene el mapa de bits como miembro, tenga la ruta como miembro serializable y reconstruya el mapa de bits después de la deserialización:

 public class MyClass implements Serializable { // ... private String bitmapPath; transient Bitmap bitmap; // ... private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); bitmap = BitmapFactory.decodeFile(path); } 

Puede implementar cualquier otra funcionalidad de compilación en la función readObject() si es necesario, ya que el objeto se construye completamente después de la llamada defaultReadObject() .

Espero que esto ayude.

BTW, http://developer.android.com/reference/android/os/Parcel.html recomienda no usar Parcelable para fines de serialización. No tengo suficientes puntos todavía para dejar un comentario, así que estoy editando mi propia respuesta para poner esta observación.

  • ArrayList no se puede convertir en clase personalizada extendiendo ArrayList
  • ¿Está utilizando Serializable en Android mal?
  • Cómo pasar ArrayList <CustomeObject> de una actividad a otra?
  • DecodeByteArray y copyPixelsToBuffer no funcionan. SkImageDecoder :: Factory devuelto null
  • ¿Un objeto serializable siempre se serializa cuando se pone en un paquete?
  • Utilizar parcelable para almacenar el elemento como sharedferencias?
  • Estado de restauración después de que el proceso se destruye
  • Android: problema con objeto Serializable puesto en intención
  • ¿Puedo enviar objetos personalizados a Android Wear?
  • Objeto serializable en la intención que devuelve como String
  • ¿Cuál es la diferencia entre Parcelable y Serialization utilizado en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.