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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Java シリアライズの基本
- transient フィールドと serialVersionUID
- カスタムシリアライズ:writeObject と readObject
- 最新の代替手段:JSON と Protocol Buffers