Categories
Tags
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