2012-05-08 136 views
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 

回答

7

你不能!
字段a不會被序列化!
解決方法:實現您的自定義序列化。您應該執行Externalizable接口和writeExternal, readExternal方法。 在這些方法中,您可以編寫和讀取您的a字段的值。

+0

那麼,是否需要在所有非空構造函數專用類上標記Serializble接口? –

+1

不,沒有必要。你將有下面的代碼:public class B extends A implements 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。下定決心。你可以或者你不能。不是在同一時間。 – EJP

相關問題