2012-05-08 8 views
8

No puedo controlar el código fuente de la clase base, entonces, ¿cómo puedo usar la serialización estándar en la subclase?¿Cómo serializar la clase base no serializable en la serialización estándar?

En este ejemplo, el campo a no es serializado en absoluto, aunque es serializable B:

// a.jar

class A { 
    int a; 
} 

// b.jar

class B 
     extends A 
     implements Serializable { 
    int b; 
} 

public class HelloWorldApp { 

    public static void main(String[] args) 
      throws Exception { 
     B b = new B(); 
     b.a = 10; 
     b.b = 20; 

     ByteArrayOutputStream buf = new ByteArrayOutputStream(); 

     ObjectOutputStream out = new ObjectOutputStream(buf); 
     out.writeObject(b); 
     out.close(); 

     byte[] bytes = buf.toByteArray(); 
     ByteArrayInputStream _in = new ByteArrayInputStream(bytes); 
     ObjectInputStream in = new ObjectInputStream(_in); 
     B x = (B) in.readObject(); 
     System.out.println(x.a); 
     System.out.println(x.b); 
    } 

} 

salida :

0 
20 

Respuesta

7

¡No puedes!
campo a no será serializado!
Solución: implemente su serialización personalizada. Debe implementar la interfaz Externalizable y los métodos writeExternal, readExternal. En los métodos de Thess puede escribir y leer el valor de su campo a.

+0

Entonces, ¿es una necesidad para marcar interfaz Serializble en todas las clases que no esté vacía-constructor-solamente? –

+1

No, no es necesario. Tendrás el siguiente código: public class B extends A implementa Externalizable {public void writeExternal (ObjectOutput out) {out.write (a); out.write (b); } public void readExternals (ObjectInput in) {a = in.readInt(); b = in.readInt(); }} – alexey28

+0

-1. Decídete. O puedes o no puedes. No ambos al mismo tiempo. – EJP

Cuestiones relacionadas