儘管java.io.Serializable接口public interface Serializable{}
令人驚訝地不包含Java中的任何方法和字段,但實現此接口的類能夠實現序列化和反序列化的功能(對象的序列化或反序列化狀態) 。如何在Java中沒有任何方法或字段的情況下實現序列化和反序列化的功能?儘管Java中的Serializable接口沒有方法,沒有字段,但它可以實現其功能。怎麼樣?
回答
某些接口僅用作「標記」或「標記」。
通過反射訪問UID和自定義閱讀器/作者。
Serializable
是一種標記,JRE/JVM可以根據它的存在採取行動。
Serializable接口是一個標記接口僅通知特定對象被設置爲被序列JVM。序列化過程發生在內部。
可串行化不包含任何方法,它是ObjectOutputStream
和ObjectInputStream
類,可以通過writeObject
和readObject
方法執行該操作。
Serializable
只是一個標記接口,換句話說,它只是放一個標誌,而不需要任何字段或方法。
更好的設計本來
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
將不會改變,但新功能可以在類似情況下使用)
我同意irreputable,expecially隱含的說法,每個對象都應該知道如何序列化/反序列化本身,除非他/她斷言:
沒有辦法提供默認implementationsckquote
肯定有:Object Composition。
序列化是一種保存對象的方式,我們使用Serializable接口來實現我們的目標。可序列化接口 是標記接口。標記界面模式是一種設計模式,它提供有關對象的運行時間信息。
這不是六年前大家說的嗎? –
如果你看到了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在內部使用這個來檢查對象是否實際可寫或不可以。
- 1. 沒有實現所有的接口方法。可能嗎?
- 2. Java:沒有接口實現?
- 3. 只有沒有其他方法實現接口的類可以嗎?
- 4. 爲什麼Java.lang.Object沒有實現Serializable接口?
- 5. Java中的ArrayList沒有實現Collection接口的方法?
- 6. 有沒有辦法在Ruby中強制實現接口方法?
- 7. PageContent如何實現IAddChild,但沒有IAddChild接口方法?
- 8. 有沒有在intellij中實現接口方法的捷徑?
- 9. 爲什麼實現Serializable接口的類實現none接口的方法?
- 10. 有沒有辦法在Java中動態實現接口?
- 11. 功能,但實際上沒有可用
- 12. CCN的Java功能 - 有沒有什麼可能是現實的限制
- 13. WCF接口沒有實現
- 14. TreeBasedTable的Guava TreeRow沒有排序,儘管它實現了SortedMap?
- 15. 在java中實現Runnable接口後,怎麼可能調用線程方法?
- 16. 有沒有辦法確保實現接口的類實現靜態方法?
- 17. 打字稿 - 實現一個接口,但沒有實施的接口父母
- 18. 有沒有什麼辦法以儘可能改變ALAssetLibrary的方式保存ALAsset?
- 19. 儘管WeakReference沒有調用finalize()方法
- 20. 的getString實現Serializable接口
- 21. 有沒有什麼方法可以重用java 8中的Stream?
- 22. 警告:MyClass:NSObject沒有實現鍵值觀察?怎麼可能?
- 23. 有沒有一種方法可以用比這少的代碼來擴展現有的接口實現?
- 24. 儘管代碼可以工作,但變量還沒有定義
- 25. 有沒有一種方法可以在Java中實現代數類型?
- 26. 原生功能沒有實現發現
- 27. 方法miner_start沒有實現
- 28. DTO實現Serializable接口
- 29. authlogic沒有cookie,怎麼樣?
- 30. 類沒有命名空間中的存在,儘管它確實
你可以實現java.io.Externalizable來控制序列化和反序列化 –