[英]How does Java handles object of generic class when deserializing?
這是一個非常簡單的泛型類:
import java.io.Serializable;
public class GenericDemoObject<T> implements Serializable {
private static final long serialVersionUID = 1L;
T date;
@Override
public String toString() {
return date.getClass().getName() + ':' + date.toString();
}
}
然后,我創建了GenericDemoObject
的實例,其T鍵入為org.joda.time.LocalDate
,並將其序列化到磁盤。 然后,我嘗試使用以下代碼對其進行反序列化:
private static Object deserialize(String fileName) throws IOException, ClassNotFoundException {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
return in.readObject();
}
}
// LocalDate is java.time.LocalDate
GenericDemoObject<LocalDate> obj = (GenericDemoObject<LocalDate>) deserialize("GenericDemoObject.ser");
我不明白反序列化是如何工作的。 為什么不拋出ClassCastException?
編輯:
更確切地說,我的意思是obj
是GenericDemoObject類型的引用,但是反序列化對象的date字段的類型是org.joda.time.LocalDate。 該任務如何工作?
在測試了您在問題中發布的案例后,我確認僅通過像您一樣進行泛型轉換就不會獲得例外,只有在您訪問字段date
檢查以下代碼后,真正的轉換才會發生:public class Main {
public static void main(String[] args) {
org.joda.time.LocalDate date = org.joda.time.LocalDate.now();
GenericDemoObject<org.joda.time.LocalDate> gdo = new GenericDemoObject<>();
gdo.date = date;
try {
serialize("GenericDemoObject.ser", gdo);
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
try {
GenericDemoObject<java.time.LocalDate> obj1 = (GenericDemoObject<java.time.LocalDate>) deserialize("GenericDemoObject.ser");//no exception
GenericDemoObject<String> obj2 = (GenericDemoObject<String>) deserialize("GenericDemoObject.ser");//no exception
LocalDate date1 = obj1.date;//The exception is thrown here
String date2 = obj2.date;//The exception is thrown here
} catch (ClassNotFoundException | IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static Object deserialize(String fileName) throws IOException, ClassNotFoundException {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
return in.readObject();
}
}
private static void serialize(String fileName, Object object) throws IOException, ClassNotFoundException {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName))) {
out.writeObject(object);
}
}
}
class GenericDemoObject<T> implements Serializable {
private static final long serialVersionUID = 1L;
T date;
@Override
public String toString() {
return date.getClass().getName() + ':' + date.toString();
}
}
我希望這回答了你的問題。
注意:我想再讀一遍評論,我認為Antoniossss確實回答了,但沒有真正將其發布為答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.