簡體   English   中英

在Serializable類中使用transient關鍵字

[英]Use transient keyword in not Serializable class

在沒有實現Serializable的類中使用transient關鍵字是否有意義?

因為ObjectOutputStream仍然可以序列化未實現Serializable類。

由於多種原因,您可能仍希望將其標記為瞬態。 立刻想到的兩個是:

  • 它可以幫助傳達該領域的語義目的。 也就是說,它可以幫助任何閱讀代碼的人理解變量的含義

  • 第三方庫可以使用該關鍵字。 例如,Google的Gson庫可以將任何對象序列化/反序列化為JSON,無論它是否實現Serializable。 在這種情況下,Gson將(默認情況下)跳過標記為瞬態的字段。

因為對象序列化比Serializable的簡單實現更復雜(考慮代理:代理對象可以實現Serializable,但不是原始對象,在代碼中你仍然使用原始類)
實現序列化的另一種方法是Externalizable接口,可以完全控制對象序列化或(來自javadoc):
在序列化和反序列化過程中需要特殊處理的類必須使用這些精確簽名實現特殊方法:

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream) throws IOException
private void readObjectNoData() throws ObjectStreamException;

有關序列化過程/機制的更多信息,請查看ObjectOutputStream javadoc

編輯:回答你的問題,transient是一個僅在序列化上下文中使用的關鍵字,所以一個不具有瞬態字段的Serializable對象沒有意義

因為ObjectOutputStream仍然可以序列化未實現Serializable類。

那是不對的。 這將拋出NotSerializableException


writeObject()接受Object而不是Serializable是簽名來自實現接口ObjectOutput ,該接口是獨立於序列化定義的。 但是,它會阻止ObjectOutputStream更改其簽名。

public interface ObjectOutput {
  // ...
  void writeObject(Object obj);
}

通常,如果超類實現Serializable它的子類也是可序列化的。這是唯一可以使字段瞬態並且類不能直接實現Serializable的情況,但除此之外,如果類不可序列化,則沒有意義使他們瞬間。

不,這沒有意義。

class State {
    // The 'transient' modifier has no effect here because
    // the 'State' class does not implement 'Serializable'.
    private transient int[] stateData;
}

暫無
暫無

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

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