624 words
3 min

デシリアライズ時にはstaticが無視される話

2026-05-15

Javaでシリアライズ/デシリアライズを扱っている時に
staticな値が復元されていない?」となったのでまとめ。

シリアライズとデシリアライズとは?#

まず前提として、シリアライズとデシリアライズは以下。

  • シリアライズ
    オブジェクトを保存や通信できる形式に変換すること。

  • デシリアライズ
    保存されたデータからオブジェクトを復元すること。

JavaではSerializableを実装することでシリアライズ可能になる。

Sample.java
import java.io.Serializable;

public class User implements Serializable {
    private String name;

    public User(String name) {
        this.name = name;
    }
}

staticはシリアライズ対象外#

本記事のメイン。
staticはクラスに属する値であり、
インスタンスに属する値ではない。

そのため、シリアライズ時に保存されない。

Sample.java
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はインスタンス変数だが
「シリアライズ対象から除外する」ためのもの。

Sample.java
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