Je ne peux pas contrôler le code source de la classe de base, comment puis-je utiliser la sérialisation standard sur la sous-classe?
Dans cet exemple, le champ a
n’est pas du tout sérialisé, bien que B soit sérialisable:
// a.jar
class A { int a; }
// b.jar
class B extends A implements Serializable { int b; } public class HelloWorldApp { public static void main(Ssortingng[] args) throws Exception { B b = new B(); ba = 10; bb = 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(xa); System.out.println(xb); } }
Sortie:
0 20
Tu ne peux pas!
le champ a
ne sera pas sérialisé!
Contournement: implémentez votre sérialisation personnalisée. Vous devez implémenter une interface Externalizable
et les méthodes writeExternal, readExternal
. Dans ces méthodes, vous pouvez écrire et lire la valeur de votre champ.