2012-05-08 20 views
8

Non riesco a controllare il codice sorgente della classe base, quindi, come posso utilizzare la serializzazione standard nella sottoclasse?Come serializzare la classe base non serializzabile nella serializzazione standard?

In questo esempio, non è a campo serializzato affatto, se B è serializzabile:

// 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); 
    } 

} 

uscita :

0 
20 

risposta

7

Non puoi!
il campo a non verrà serializzato!
Work around: implementa la tua serializzazione personalizzata. È necessario implementare l'interfaccia Externalizable e i metodi writeExternal, readExternal. In questi metodi è possibile scrivere e leggere il valore del campo a.

+0

Quindi, è necessario contrassegnare l'interfaccia Serializble su tutte le classi non-empty-only del costruttore? –

+1

No, non necessario. Avrai il prossimo codice: public class B extends A implementazioni 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. Deciditi. O puoi o non puoi. Non entrambi allo stesso tempo. – EJP

Problemi correlati