0Pricing
Java Academy · レッスン

transient フィールドと serialVersionUID

transient で機密フィールドを除外し、serialVersionUID でバージョン互換性を維持します。

「transient フィールドと serialVersionUID」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

なぜtransientを使うのですか

パスワード、開いているファイルハンドル、キャッシュされた計算結果など、保存すべきでないフィールドがあります。そのようなフィールドにtransientを付けると、シリアライズ中にスキップされます。

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

デシリアライズ後のTransientフィールドの値

デシリアライズ後、transientフィールドにはJavaのデフォルト値が設定されます。オブジェクトはnull、数値は0、booleanはfalseです。

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

serialVersionUIDとは

serialVersionUIDは、バージョン情報として機能するlong定数です。クラスが変更され、UIDがファイル内の値と一致しない場合、デシリアライズ時にInvalidClassExceptionがスローされます。

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

自動生成UIDと明示的なUID

serialVersionUIDを省略すると、Javaはクラス構造から値を生成します。フィールドを変更するだけでもUIDが暗黙的に変わり、古いデータが使えなくなります。必ず明示的に宣言してください。

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

バージョン不一致によるInvalidClassException

UIDが変更されたクラスで古いシリアライズデータを読み込むと、JavaはInvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Yをスローします。

安全なクラスの進化

UIDを変更せずに、シリアライズ可能なクラスへ新しいフィールドを安全に追加できます。古いストリームをデシリアライズすると、新しいフィールドにはデフォルト値が設定されます。フィールドの削除や名前変更は、より危険です。

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email; // Added in v2 — safe if UID unchanged
}

遅延初期化でのtransient

よく使われるパターンとして、キャッシュされたフィールドや派生フィールドにtransientを付け、デシリアライズ後にreadResolveまたはゲッターで遅延再計算します。

public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    private String content;
    private transient int wordCount = -1;
    public int getWordCount() {
        if (wordCount == -1) wordCount = content.split("\\s+").length;
        return wordCount;
    }
}

staticフィールドは決してシリアライズされない

staticフィールドはインスタンスではなくクラスに属します。そのため、シリアライズストリームには決して含まれず、シリアライズされるのはインスタンスフィールドだけです。

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

serialverツールの使用

serialver JDKツールは、クラスのデフォルトのserialVersionUIDを出力します。serialver com.example.Userのように実行し、明示的に追加する前の値を取得してください。

代替手段としてのExternalizable

ExternalizableはSerializableを拡張し、writeExternalとreadExternalによって完全な制御を可能にします。transientを使わずにフィールドを明示的に制御したい場合に便利です。

public class Config implements Externalizable {
    private String host;
    private transient String secret;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(host);
    }
    public void readExternal(ObjectInput in) throws IOException {
        host = in.readUTF();
    }
}

ベストプラクティス

必ずserialVersionUIDを宣言してください。パスワード、ハンドル、キャッシュにはtransientを付けます。互換性のない変更を行う場合はUIDを増やし、バージョン履歴を記録してください。

クイックチェック

デシリアライズ後、transientなintフィールドの値は何になりますか。

まとめ

フィールドをシリアライズから除外するにはtransientを使用します。バージョン管理を制御するため、必ずserialVersionUIDを宣言してください。staticフィールドは、どのような場合でもシリアライズされません。

よくある質問

「transient フィールドと serialVersionUID」レッスンは無料ですか?

はい。「transient フィールドと serialVersionUID」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「transient フィールドと serialVersionUID」で何を学びますか?

transient で機密フィールドを除外し、serialVersionUID でバージョン互換性を維持します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「transient フィールドと serialVersionUID」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Java シリアライズの基本
  2. transient フィールドと serialVersionUID
  3. カスタムシリアライズ:writeObject と readObject
  4. 最新の代替手段:JSON と Protocol Buffers
← Java Academyに戻る