簡體   English   中英

反序列化時Java如何處理通用類的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM