[英]Fields in a “Serializable” class should either be transient or serializable
[英]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.