2012-05-08 11 views
8

Nie mogę kontrolować kodu źródłowego klasy bazowej, a następnie, w jaki sposób mogę użyć standardowej serializacji w podklasie?Jak przeprowadzić szeregowanie niezdefiniowanej klasy bazowej w standardowej serializacji?

W tym przykładzie pole a nie jest w odcinkach w ogóle, chociaż B jest serializacji:

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

} 

Output :

0 
20 

Odpowiedz

7

Nie możesz!
pole a nie zostanie przekształcone do postaci szeregowej!
Praca: zaimplementuj niestandardową serializację. Powinieneś zaimplementować metody Externalizable interfejsu i writeExternal, readExternal. W tych metodach można zapisać i odczytać wartość pola a.

+0

Czy istnieje potrzeba oznaczenia interfejsu Serializble we wszystkich klasach, które nie są wolne od konstruktora? –

+1

Nie, nie jest to konieczne. Będziesz miał następny kod: public class B extends A tools 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. Uzupełnić swój umysł. Albo możesz, albo nie możesz. Nie oboje w tym samym czasie. – EJP

Powiązane problemy