2011-11-05 70 views

回答

1

Serializable接口是一個標記接口僅通知特定對象被設置爲被序列JVM。序列化過程發生在內部。

2

可串行化不包含任何方法,它是ObjectOutputStreamObjectInputStream類,可以通過writeObjectreadObject方法執行該操作。

Serializable只是一個標記接口,換句話說,它只是放一個標誌,而不需要任何字段或方法。

1

更好的設計本來

interface Serializable 

    void writeObject(ObjectOutputStream out) 

    void readObject(ObjectInputStream in) 

的問題是,有沒有辦法提供默認的實現;所以每個子類都必須實現這兩個方法,這是一個麻煩。

class MyClass implements Serializable 

    // stupid boilerplate code 
    void writeObject(ObjectOutputStream out) 
    { 
     Util.defaultWriteObject(this, out); 
    } 

在Java 8,這將改變,我們可以有接口方法的默認impls

interface Serializable 

    void writeObject(ObjectOutputStream out) default Util::defaultWriteObject 

    void readObject(ObjectInputStream in) default Util::defaultReadObject 

Serializable將不會改變,但新功能可以在類似情況下使用)

+0

你可以實現java.io.Externalizable來控制序列化和反序列化 –

0

我同意irreputable,expecially隱含的說法,每個對象都應該知道如何序列化/反序列化本身,除非他/她斷言:

沒有辦法提供默認implementationsckquote

肯定有:Object Composition

0

序列化是一種保存對象的方式,我們使用Serializable接口來實現我們的目標。可序列化接口 是標記接口。標記界面模式是一種設計模式,它提供有關對象的運行時間信息。

+0

這不是六年前大家說的嗎? –

0

如果你看到了ObjectOutputStream的writeObject方法的執行,下面的代碼片段將在實現中看到。

在這裏你可以看到,如果你的類沒有實現Serializable接口,那麼拋出NotSerializableException異常 。

if (obj instanceof String) { 
    writeString((String) obj, unshared); 
} else if (cl.isArray()) { 
    writeArray(obj, desc, unshared); 
} else if (obj instanceof Enum) { 
    writeEnum((Enum<?>) obj, desc, unshared); 
} else if (obj instanceof Serializable) { 
    writeOrdinaryObject(obj, desc, unshared); 
} else { 
    if (extendedDebugInfo) { 
     throw new NotSerializableException(
      cl.getName() + "\n" + debugInfoStack.toString()); 
    } else { 
     throw new NotSerializableException(cl.getName()); 
    } 
} 

序列化僅僅是一個標記接口。 Java在內部使用這個來檢查對象是否實際可寫或不可以。

相關問題