簡體   English   中英

可序列化和瞬態

[英]Serializable and transient

要使類可序列化,我們執行以下操作:

class A implements Serializable {
    transient Object a;
}

而不是這個:

serializable class A {
   transient Object a;
}

為什么,如果我們想使類可序列化,我們是否實現了一個特殊的接口 如果我們想要排除某些字段,我們會使用關鍵字 transient 為什么兩種情況下都沒有使用特殊關鍵字? 我的意思是有什么理由以不同的方式做同樣的事情嗎? 我知道,沒有像serializable這樣的關鍵字但為什么不引入而不是特殊的接口Serializable

為什么沒有使用一些特殊的關鍵字將類標記為可序列化? Serializable接口在代碼中看起來像一個神奇的數字,而不像語言功能。

我認為你必須以另一種方式來看待它:語言關鍵字的存在主要是為了支持編譯時語言結構。 序列化是一種運行時機制。 此外,您不希望為所有內容添加額外的關鍵字,因為您無法將其用作標識符。 另一方面,標記界面的侵入性要小得多。

問題是:為什么我們需要一個語言關鍵字來標記瞬態字段? 答案是當時沒有其他方法可以標記特定字段。

如今,在這兩種情況下都會為此目的使用注釋(以及其他類似於obscure strictfp關鍵字的東西)。

Serializable是一個標記界面。 接口是指示類的特征的標准方式(在Java和一些其他語言中); “是一種”關系。 使Serializable成為一個接口意味着我們可以聲明接受或返回Serializable的方法就像我們可以使用其他接口的方法一樣。 任何其他東西都需要語言的語法更改(當時;現在我們有注釋,但我認為仍然會使用一個接口)。

所以你問為什么你不能將類標記為不可序列化(如瞬態成員)? 為什么不將不可序列化類型的類成員標記為瞬態? 或者在進行序列化時使用該類類型的序列化委托? 這似乎有點不可思議,你想告訴的Java在這個水平做某事,而不是告訴它一些事情的。

Serializable是一個標記接口(如Cloneable ),用於為標准Java運行時庫代碼設置一個標志,可以根據該類的設計者對對象進行序列化。

transient關鍵字可用於指定不需要序列化屬性,例如因為它是派生屬性。

另見關於SO的類似問題的回復,以及關於設計標記接口的問題

更新

為什么標記接口,沒有可序列化,可復制等的關鍵字? 我的猜測是,如果行為方面將語言納入語言,則可以使用新的標記接口和過多的關鍵字一致地擴展Java運行時庫。

類屬性無法實現接口和transient的事實可以被視為屬性的通用屬性,這有助於將transient作為語言關鍵字引入。

瞬態關鍵字用於保護變量或字段不被存儲,我們這樣做是為了保護我們不想在每個地方分發的一些敏感信息,我們使用Serializable接口來創建Serializable類。 雖然我們也可以使用Externalizable接口,但由於一些優點,我們更喜歡使用Serializable。

盡管如此,要清楚地了解序列化和瞬態關鍵字。 http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/

暫無
暫無

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

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