Categories
Tags
AIML autoboxing AWS aws blockchain CTA data Databricks DataEngineering defer EOL equals findany findfirst GAS Google Drive header html html5 http ipc java Java javascript JSF named-pipe network nft nodejs PostgreSQL PySpark pyspark python Seasar2 serialize smart-contract spark sql stream Teeda TOCTOU UI UML unity catalog UX WCAG web3 Webデザイン word シーケンス図 システム設計 スイムレーン図 セキュリティ ダークパターン デッドロック トランザクション フローチャート レガシーシステム 外部設計 基本設計 設計 設計書 排他制御
624 words
3 min
デシリアライズ時にはstaticが無視される話
Javaでシリアライズ/デシリアライズを扱っている時に
「staticな値が復元されていない?」となったのでまとめ。
シリアライズとデシリアライズとは?
まず前提として、シリアライズとデシリアライズは以下。
シリアライズ
オブジェクトを保存や通信できる形式に変換すること。デシリアライズ
保存されたデータからオブジェクトを復元すること。
JavaではSerializableを実装することでシリアライズ可能になる。
import java.io.Serializable;
public class User implements Serializable {
private String name;
public User(String name) {
this.name = name;
}
}staticはシリアライズ対象外
本記事のメイン。staticはクラスに属する値であり、
インスタンスに属する値ではない。
そのため、シリアライズ時に保存されない。
import java.io.*;
class User implements Serializable {
static String company = "OpenAI";
String name;
User(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) throws Exception {
User user = new User("Taro");
// シリアライズ
ObjectOutputStream out =
new ObjectOutputStream(new FileOutputStream("user.dat"));
out.writeObject(user);
out.close();
// staticの値を変更
User.company = "Google";
// デシリアライズ
ObjectInputStream in =
new ObjectInputStream(new FileInputStream("user.dat"));
User loadedUser = (User) in.readObject();
in.close();
System.out.println(loadedUser.name);
System.out.println(User.company);
}
}実行結果
Taro
Googleシリアライズ時にはcompany = "OpenAI"だったが
デシリアライズ後はGoogleになっている。
これはstaticが保存されていないため。
なぜstaticは保存されない?
staticはインスタンスごとの値ではなく、
クラス全体で共有される値。
つまり、シリアライズ対象の「オブジェクトの状態」には含まれない。
イメージとしては以下。
インスタンス変数 -> オブジェクトごとのデータ
static変数 -> クラス共通のデータJavaのシリアライズは
「インスタンスの状態」を保存する仕組みのためstaticは対象外になる。
transientとの違い
staticのシリアライズと似た話としてtransientがある。
transientはインスタンス変数だが
「シリアライズ対象から除外する」ためのもの。
class User implements Serializable {
String name;
transient String password;
}違いとしては以下。
| 種類 | シリアライズ対象 |
|---|---|
| static | 対象外 |
| transient | 明示的に対象外 |
| 通常フィールド | 対象 |
注意点
staticに設定値などを保持している場合、
デシリアライズ時に想定外の値になっている可能性がある。
特に以下は注意。
- キャッシュ
- 設定情報
- シングルトン管理
- staticカウンタ
「保存されて復元される」と思っているとハマりやすい。
まとめ
Javaのシリアライズではstaticはインスタンスに属する値ではないため保存されない。
そのため、デシリアライズ時には
現在のクラス側のstatic値がそのまま使用される。
シリアライズ対象にしたい値はstaticではなく通常フィールドとして保持する必要がある。
関連記事・トピックリンク
デシリアライズ時にはstaticが無視される話
https://tech.storias-blog.com/blogs/java_deserialize_static/作者
Storia
公開日
2026-05-15