web-dev-qa-db-ja.com

Javaで「transient」キーワードを使用する理由

Javaのtransient修飾子の前のprivateキーワードの使用に関連する問題があります。

変数宣言:

transient private ResourceBundle pageResourceBundle; 

私のクラスは次のようになります:

public class LoginViewModel extends AbstractViewModel {

    transient private ResourceBundle pageResourceBundle;

    @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        initializeLoginValues();
        boolean timeout = BooleanUtils.toBoolean(getHttpServletRequest().getParameter("timeout"));
        if (timeout) {
            Messagebox.show(pageResourceBundle.getText("MSG_SESSION_HAS_EXPIRED_PLEASE_LOGIN"), pageResourceBundle.getText("LABEL_ALERT"),
                    Messagebox.OK, Messagebox.ERROR);
        }
        view.getPage().setTitle(CsdcLicence.get().getApplicationName());
    }

質問があります。

1.プライベート変数の前にtransientキーワードを使用するのはなぜですか?

2.このキーワードを使用する目的は何ですか?

11
Sitansu

一時変数がJavaでシリアル化されることはありません。

メンバー変数がバイトストリームに永続化されるときにシリアル化されないようにマークします。オブジェクトがネットワークを介して転送されるとき、オブジェクトは「シリアル化」される必要があります。シリアル化は、オブジェクトの状態をシリアルバイトに変換します。これらのバイトはネットワークを介して送信され、オブジェクトはそれらのバイトから再作成されます。 Java transientキーワードでマークされたメンバー変数は転送されず、意図的に失われます。

serialization とは何かをご覧ください。また、参照 this

public class Foo implements Serializable
{
  private String saveMe;
  private transient String dontSaveMe;
  private transient String password;
  //...
}

上記の例では、dontSaveMepasswordtransient variablesとして宣言されているため、シリアル化されません。

29
rachana

そして短い使用-ケース:
公開されているWebサービスを介してユーザー-オブジェクトを公開することを想像してください。ニックネーム、オンライン-州、場合によってはメールや場所などとして公開したいと思います。ユーザーがログインに使用するパスワードを明らかにしたくないはずです。このパスワードはユーザーオブジェクトのプロパティである可能性がありますが、シリアル化しないでください。オブジェクトをJSONにシリアル化する場合-上記のWebサービスの文字列。

17
Peter

transientキーワードは、オブジェクトが シリアル化しないでください、 持続しない。重いオブジェクト(たとえば、Wrappersなど、大量のビジネスロジックを含む可能性がある)をシリアル化したくない場合に使用できます。

@Transientアノテーションは、オブジェクトが 永続化すべきではない (たとえば、Hibernateを使用していた場合)が、 シリアライズ可能

2つに混乱したことを覚えているので、注釈の説明を含めました。 :-)

7
GGrec

transientは、保存されないオブジェクトのプロパティまたはserialisedを指定するために使用されます。たとえば、オブジェクトをファイルに保存する場合、transientは、そのオブジェクトがファイルに保存されるときにそのファイルに保存されないプロパティまたは属性を指定します。

オブジェクトがファイルから再作成されるとき、そのtransient属性(またはプライベートプロパティ)の値は、保存されていないか、そのファイルにシリアル化されていないため、再作成されません。場合によっては、これらのプライベートインスタンス変数またはオブジェクトの属性の一部を永続化したくない場合があります。transientを使用すると、それを実行できます。

3
blackpanther