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

anonymity
リリース: 2020-09-10 15:32:19
オリジナル
8714 人が閲覧しました

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

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

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

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!