静的メンバーはクラス レベルに属しているため、シリアル化できません。ここでシリアル化できないとは、静的メンバーのフィールドがシリアル化情報に含まれていないことを意味します。
#静的変数をシリアル化できない理由を示す例を次に示します:
Class Student1
package test; import java.io.Serializable; public class Student1 implements Serializable{ private static final long serialVersionUID = 1L; private String name; private transient String password; private static int count = 0; public Student1(String name,String password){ System.out.println("调用Student的带参构造方法 "); this.name = name; this.password = password; count++; } public String toString(){ return "人数:" + count + "姓名:" + name + "密码:" + password; } }
Class ObjectSerTest1
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectSerTest1 { public static void main(String args[]){ try{ FileOutputStream fos = new FileOutputStream("test.obj"); ObjectOutputStream oos = new ObjectOutputStream(fos); Student1 s1 = new Student1("张三","123456"); Student1 s2 = new Student1("王五","56"); oos.writeObject(s1); oos.writeObject(s2); oos.close(); FileInputStream fis = new FileInputStream("test.obj"); ObjectInputStream ois = new ObjectInputStream(fis); Student1 s3 = (Student1) ois.readObject(); Student1 s4 = (Student1) ois.readObject(); System.out.println(s3); System.out.println(s4); ois.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } }
実行結果:
パラメータを指定して学生のコンストラクタを呼び出す
パラメータを指定して学生のコンストラクタを呼び出す
人数: 2 名前: Zhang San のパスワード: null
人数: 2 名前: Wang Wu パスワード: null
クラス Test1
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Test1{ public static void main(String args[]){ try { FileInputStream fis = new FileInputStream("test.obj"); ObjectInputStream ois = new ObjectInputStream(fis); Student1 s3 = (Student1) ois.readObject(); Student1 s4 = (Student1) ois.readObject(); System.out.println(s3); System.out.println(s4); ois.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } }
実行結果:
人数: 0 名前: Zhang San パスワード: null
人数: 0 名前: Wang Wu パスワード: null
概要:
クラス ObjectSerTest1 実行結果は count=2 を示し、シリアル化されているように見えますが、クラス Test1 の実行結果は count=0 がシリアル化されていないことを示しています。
「シリアル化ではオブジェクトの状態が保存され、静的変数はクラスの状態であるため、シリアル化では静的変数は保存されません。
ここでの「シリアル化できない」の意味はシリアル化です。この情報には、この静的メンバー フィールド
ObjectSerTest1 は含まれていません。これらはすべて同じマシン (および同じプロセス) 上にあるため、テストは成功します。jvm にはすでにカウントが読み込まれているため、取得されるのはロードされたカウントを別のマシンに転送するか、プログラムを閉じて書き換えて test.obj を読み取るプログラムを作成した場合、このとき、他のマシンまたは新しいプロセスがカウントをリロードするため、カウント情報は初期値になります。情報。 "----- 参照 Web ページより
クラス Test1 を書き換えると test.obj が読み取られ、表示される結果は count の初期情報であり、これも上記の段落を検証します。
最後に、Java オブジェクトの静的および一時的に変更されたプロパティはシリアル化できません。
以上が静的変数をシリアル化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。