簡體   English   中英

如果Serializable類中存在不可序列化的字段,將會產生什么影響?

[英]What will be the impact if there is a non serializable field in a Serializable class?

我正在做一些代碼審查,並遇到了包含一個不可序列化字段的可序列化類。 該字段均未聲明為transient 這種代碼可以稱為代碼氣味嗎? 如果是,那為什么呢?

public class A implements Serializable{

 private B field ; // B is non serializable

}

如果對象的執行時間類型不可序列化,則在嘗試對其進行序列化時將引發異常。

例如,這確實序列化了:

導入java.io. *;

public class Test implements Serializable {
    private Object object;

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        test.object = "";
        // Now serialize test
    }
}

這將創建一個適當的文件-但如果將test.object設置為new Object() ,則它將引發異常。

這不僅是代碼的味道-這是一個錯誤,除非B是一個抽象類並且所有具體的子類都可以序列化...或者您知道其他方式,除非field的值可以序列化或為null,否則它將永遠不會序列化。

當您嘗試序列化對象時,這將是一個例外(除非字段為null或實際對象是B的可序列化子類的對象)。

您必須使其成為瞬態的或可序列化的(或實現自己的序列化方法)。

不是該字段,而是此字段指向的對象可能導致NotSerializableException。 例如,如果field為null,則不會有異常。 否則,如果field指向C的實例,而C的實例是B的可序列化的子類,則不會例外。

如果您嘗試序列化A將導致錯誤。 因為B不可序列化。 是代碼味道。

暫無
暫無

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

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