簡體   English   中英

如何使通用類型 class 可序列化?

[英]How to make a generic typed class serializable?

用例如下,我有一個通用的 class 如下:

public class Test<T> implements Serializable {
private T testObject;
 .....
} 

隨着 sonarLint 關閉,抱怨字段 testObject 應該是瞬態的或可序列化的。

如果我按如下方式進行所需/建議的更改:

public class Test<T extends Serializable> implements Serializable {
    private T testObject;
     .....
    } 

雖然如果我想使用這個通用測試 class,那么我不能將它與接口類型一起使用,例如 List 接口,因為 List 當然不是可序列化的。

這不會編譯,但在我看來是針對接口編程的首選方式。

public Test<List<String>> doSomething() {
}

這編譯,但實際上不是我想要的......

public Test<ArrayList<String>> doSomething() {
}

所以,不確定我的問題的答案是什么......我應該忽略 SonarLint 警告還是有不同的方法來解決/繞過這個?

包含對不可序列化 object 的引用的 object 無法通過默認序列化算法進行序列化。 對於您的特定情況,沒有類型安全的方式來進行自定義序列化。 因此,您只有三個主要選擇:

  1. 不要修改您的原始代碼,並在它聲明自己Serializable時接受它的謊言 如果 class 可Serializable對您來說真的很重要——也就是說,您計划序列化實例——那么這會產生不可忽略的故障風險,但如果在實踐中, testObject成員始終是可序列化的。 這實際上是java.util.ArrayList和其他一些可序列化的標准庫類所采用的策略。

  2. 不要讓您的 class 可Serializable 然后眼前的問題就消失了,但當然,實例更不是默認可序列化的。 這可能對你不起作用。

  3. 使用T extends Serializable (或extends其他一些可序列化類型)實現您描述的建議更改。 這是類型安全的替代方案。 它避免了序列化失敗的風險,因為這在您的類的控制范圍內。 成本如您所描述 - type 參數將排除不可序列化的類型。 對於List的特定情況,您可以改為使用可序列化的List實現之一來代替List接口,但您必須確定它在技術上和風格上對您的效果如何。

我們無法告訴您其中哪一個最適合您的特定目的。 你必須自己決定。

不!

為什么要在 2022 年實現 Serializable?

如果你只是不實現 Serializable 你的問題就解決了。 序列化可能會給您帶來更多的問題而不是好處。 如果一個框架迫使你去實現它,那就離開那個框架,因為生命很短,無法在 2022 年使用序列化來創造新的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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