Java における「Transient」キーワードの目的は何ですか?効果的に使用するにはどうすればよいですか?

王林
リリース: 2024-08-21 06:07:02
オリジナル
1082 人が閲覧しました

What is the Purpose of the “Transient” Keyword in Java? How to Effectively Use It?

1. Java の Transient キーワードの概要

1.1 Java における「一時的」とは何を意味しますか?

Java の transient キーワードは、クラス フィールドをシリアル化しないことを示すためにクラス フィールドに適用される修飾子です。オブジェクトがシリアル化されると、そのすべてのフィールドがバイト ストリームに変換されます。フィールドを一時的としてマークすると、シリアル化中にそのフィールドを無視するように Java 仮想マシン (JVM) に指示します。

1.2 Transient キーワードを使用する理由

パスワードなどの機密情報、またはキャッシュや派生値などの重要でないデータがシリアル化されるのを防ぐ場合は、transient キーワードの使用が不可欠です。これは、セキュリティとパフォーマンスの最適化の両方にとって非常に重要です。

例:

import java.io.Serializable;

public class UserSession implements Serializable {
    private String userName;
    private transient String password;

    public UserSession(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    @Override
    public String toString() {
        return "UserSession{" +
                "userName='" + userName + ''' +
                ", password='" + password + ''' +
                '}';
    }
}
ログイン後にコピー

この例では、 passwordtransient としてマークされているため、 UserSession オブジェクトと一緒にシリアル化されません。

2. ユースケースと利点を理解する

transient キーワードを最大限に活用するには、その具体的な使用例と利点を理解することが重要です。

2.1 機密データの保護

transient を使用する主な理由の 1 つは、シリアル化中に機密データを保護することです。たとえば、シリアル化されたオブジェクトにプレーンテキストのパスワードを保存すると、セキュリティ リスクが生じる可能性があります。これらのフィールドを transient としてマークすると、そのようなデータがシリアル化から確実に除外されます。

例:

// Serialization Process
UserSession session = new UserSession("JohnDoe", "supersecret");
System.out.println("Before Serialization: " + session);

FileOutputStream fileOut = new FileOutputStream("session.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(session);
out.close();
fileOut.close();

// Deserialization Process
FileInputStream fileIn = new FileInputStream("session.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
UserSession deserializedSession = (UserSession) in.readObject();
in.close();
fileIn.close();

System.out.println("After Deserialization: " + deserializedSession);
ログイン後にコピー

出力:

Before Serialization: UserSession{userName='JohnDoe', password='supersecret'}
After Deserialization: UserSession{userName='JohnDoe', password='null'}
ログイン後にコピー

示されているように、パスワードは逆シリアル化後は保持されません。

2.2 パフォーマンスの向上

クラスには、保存するのではなく再計算できるフィールドが含まれる場合があります。このようなフィールドを一時的としてマークすると、シリアル化されるデータの量が削減され、パフォーマンスが向上します。

2.3 シリアル化不可能なフィールドのシリアル化の回避

スレッドなどの特定のオブジェクトは本質的にシリアル化できません。クラスにシリアル化可能ではないが永続化する必要がないフィールドがある場合、それらのフィールドを一時的としてマークすると、シリアル化の問題を防ぐことができます。

例:

public class TaskExecutor implements Serializable {
    private transient Thread thread;

    public TaskExecutor() {
        this.thread = new Thread();
    }

    // Additional methods
}
ログイン後にコピー

ここでは、スレッド オブジェクトはシリアル化できないため、スレッド フィールドは 一時的 としてマークされています。

3. Transient キーワードの代替

transient キーワードは強力ですが、Java でシリアル化を制御する別のアプローチもあります。

3.1 外部化可能なインターフェイスの使用

詳しくは をご覧ください: Java の「Transient」キーワードの目的は何ですか?効果的な使い方は?

以上がJava における「Transient」キーワードの目的は何ですか?効果的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!