ホームページ  >  記事  >  Java  >  静的変数をシリアル化できないのはなぜですか?

静的変数をシリアル化できないのはなぜですか?

anonymity
anonymityオリジナル
2019-05-07 09:41:268750ブラウズ

静的メンバーはクラス レベルに属しているため、シリアル化できません。ここでシリアル化できないとは、静的メンバーのフィールドがシリアル化情報に含まれていないことを意味します。

静的変数をシリアル化できないのはなぜですか?

#静的変数をシリアル化できない理由を示す例を次に示します:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。