2011-11-22 23 views
5

Tengo un pequeño problema: Quería probar la serialización en android (usando eclipse) y encontré un ejemplo de cómo hacerlo. Sé que necesito implementar "Serializable" en la clase que quiero serializar, ya lo hice y siempre recibo una excepción java.io.NotSerializableException. Aquí está el código:java.io.NotSerializableException incluso si implemento "Serializable"

public void Button(View view) throws IOException, ClassNotFoundException { 
ser test = new ser(); 
    test.x = 204; 
    test.y = 2843; 
    test.speed = 12; 
    test.direction = 1343; 
    test.a = 493; 
    test.b = 2323; 
    test.c = 29489; 
    test.d = 394; 

    byte[] arr = serialize(test); 

    ser res = (ser) deserialize(arr); 
} 


public static byte[] serialize(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutput out = new ObjectOutputStream(bos);  
     out.writeObject(o);          //This is where the Exception occurs 
     out.close();  
     // Get the bytes of the serialized object  
     byte[] buf = bos.toByteArray(); 
     return buf;  
    } catch(IOException ioe) { 
     Log.e("serializeObject", "error", ioe);   //"ioe" says java.io.NotSerializableException exception 
     return null; 
    } 

} 


public static Object deserialize(byte[] b) { 
     try {  
      ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));  
      Object object = in.readObject();  
      in.close(); 
      return object; 
     } catch(ClassNotFoundException cnfe) { 
      Log.e("deserializeObject", "class not found error", cnfe); 
      return null; 
     } catch(IOException ioe) { 
      Log.e("deserializeObject", "io error", ioe);  
      return null; 
     } 
    } 

class ser implements Serializable { 
    float x, y, speed, direction, a, b, c, d; 
} 

espero que me puedan ayudar, no sé lo que hice mal ...

Editar: mis importaciones son:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
+0

Mire en Android Parcelables, es probablemente lo que realmente quiere usar. – blindstuff

+0

como respondido/comentado a continuación, al llamar 'Button (null)' funciona como se esperaba: sin excepción y obteniendo los valores correctos en 'res'. Debe ser el medio ambiente ... –

+0

¿Cómo lo estás probando? ¿Utiliza el amulador? ¿Se despliega en un dispositivo real? ¿Qué versión de emulador/Android estás usando? Existen diferencias entre las diferentes encarnaciones de Android (como Cyanogen vs Stock Android, etc.). –

Respuesta

6

Lo único Lo que puedo pensar es que las clases que estás ejecutando no son las que has escrito, por ejemplo no ha compilado la versión más nueva.

No puedo reproducir el problema con un programa Java simple.

Inicialmente pensé que podría haber implementado sunw.io.Serializable en lugar de java.io.Serializable, pero amplía la clase io, por lo que debería funcionar incluso con ella.

+0

+1 ese es un buen punto, hay más de una interfaz Serializable. –

+0

parece que sunw.io.Serializable se extiende java.io.Serializable, así que estoy editando ese punto – Bozho

+0

que funciona (y con cualquiera de esos Serializables). –

7

Bueno, ¿su objeto serializable tiene alguna referencia a otros objetos no serializables? Si es así, se lanzará el java.io.NotSerializableException por eso. Para poder serializar, debe tener implementada su clase Serializable Y todas las dependencias del tipo Serializable (es decir, implementar Serializable).

El mensaje de excepción debe decirle si existe tal dependencia no serializable:

Debería decir algo así como "java.io.NotSerializableException: NonSerializableClassName"

Actualización: de acuerdo con el comentario de Bozho, yo no Notamos que, de hecho, su clase no tiene dependencias no serializables.

+0

solo tiene flotadores allí – Bozho

+0

Sí, mi mal, no me di vuelta hasta el final, no vi que la clase "ser" también estaba allí. Actualizaré mi respuesta para reflejar esto. –

+0

¿O hay otra forma de serializar una clase? Todo lo que quiero hacer es enviar una clase como esta con bluetooth y solo permite matrices de bytes ... – user1059863

3

Tengo la respuesta desde abajo enlace, a pesar de que no puedo entender todo el asunto. why does this simple serializable object throw NotSerializableException? Debido a que su clase interna no es estática, para existir como una cosa serializada, necesitará la instancia de la clase outter y una actividad no se puede serializar. Haga Tester una clase separada o conviértala en una clase interna estática.

0

Pregunta anterior, pero agregaría mi solución porque recientemente tuve un problema similar.

Solución, asegúrese de que su clase ser no es una clase anidada. La serialización incorporada en Java fallaría sin error si su clase está anidada en una clase principal no implementada.

Mueva la implementación de clase ser a su propio archivo ser.java y la serialización debería funcionar ahora.

0

Me rompí la cabeza con esto. Emitir mi código era que no estaba borrando mi archivo .ser antes de escribir el nuevo objeto. Mi propósito es escribir (serializar) ArrayList de ubicaciones y deserializarlas. Esto hago cuando obtengo una nueva ubicación. Como no pude agregar los objetos que elegí para escribir la lista completa, tengo que eliminar el archivo .ser cada vez antes de escribir la nueva lista. El error que muestra no apunta al problema real. Haga que su servidor esté fresco y limpio antes de escribirle algo.

0

Sé que estoy un poco tarde, pero he notado que no tiene un serialVersionUID, algo así como private static final long serialVersionUID = 7536482295622776147L; en la parte superior de su clase, también (aunque no importa, podría ayudar) intente separar sus variables , por lo que:

class ser implements Serializable { 
    private static final long serialVersionUID = 7536482295622776147L; 
    float x; 
    float y; 
    float speed; 
    float direction; 
    float a; 
    float b; 
    float c; 
    float d; 
} 

una vez más, estoy un poco tarde, pero esta cuestión tiene miles de puntos de vista, y usted no ha recogido una respuesta, así que quizás esto ayude a alguien.

Cuestiones relacionadas