8

基本クラスのソース コードを制御できない場合、サブクラスで標準のシリアル化を使用するにはどうすればよいですか?

この例では、フィールドaはまったくシリアライズされていませんが、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);
    }

}

出力:

0
20
4

1 に答える 1

7

できません!
フィールドaはシリアル化されません!
回避策: カスタムのシリアル化を実装します。ExternalizableインターフェイスとwriteExternal, readExternalメソッドを実装する必要があります。これらのメソッドでは、フィールドの値を読み書きできますa

于 2012-05-08T06:27:25.133 に答える