我們有一個名為“Vehicle”的超類,它實現了marker接口Serializable。然后我們有一個名為“Car”的子類,它繼承了“Vehicle”,因此子類“Car”也實現了可序列化標記接口,因為它的父類是“Vehicle”。
現在,我們可以將車輛的任何實例序列化為文件,而不會出現任何問題。但是,當我們嘗試將該文件反序列化為“Car”類型的對象時,程序會拋出一個異常。
我解決這個問題的方法是在“Car”類中手動實現可序列化標記接口。
為什么會這樣?從我今天在連載上讀到的所有東西來看,似乎沒有人涉及這個問題。
我得出的結論是:當“Car”類繼承“Vehicle”類時,它也繼承了“Vehicle”中實現的接口,因此“Car”對象是可序列化的,但是一旦我們將“Car”對象的一個實例序列化到一個文件中(例如:"car1.ser"),"car1.ser“文件有一個對象被寫入它,其中包含它的所有修飾符、屬性、方法等。但不知怎的,寫入"car1.ser”文件的“Car”類型的對象并不繼承“Serializable”來自其父對象的標記。原因是什么,我不太清楚。
什么例外?(請考慮將其添加到帖子中,因為它看起來像是一個“重要的細節”)。
抱歉,無法re-produce/comprehend:
Prints:
我們還可以做到:
But not:
…這將導致:
在這一行:
Reference: https://docs.oracle.com/en/java/javase/17/docs/specs/serialization/serial-arch.html