オブジェクトをシリアル化するときに応じて、Javaの静的デシリアライゼーションの差

Mrbel:

私はJavaで(デ/)シリアライズを把握しようとしています。

私がいることを、読んだことがあるstatic変数がされていないシリアライズ。

このアウトを把握するために、私は少し例を作りました。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerialDemo {

    private static void writeFile() throws IOException, ClassNotFoundException {
        ObjectOutputStream o=new ObjectOutputStream(new FileOutputStream("foo"));
        Test test = new Test();
        o.writeObject(test);
        o.flush();
    }

    private static Test readFile() throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectInputStream in=new ObjectInputStream(new FileInputStream("foo"));
        return (Test) in.readObject();
    }
}
class Test implements Serializable{
    static Integer i;
    public Test(){
        i = 10;
    }
}

なぜ、これらの二つの主な-メソッドの実行の間にそこの違いは何ですか?

最初のバージョン:単一の実行でシリアライズしデシリアライズ

public static void main(String[] args)  {

        try {
            // Serialization
            writeFile();
            // Deserialization
            Test deserializedFile = readFile();
            System.out.println(deserializedFile.i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

この出力10しかし、なぜ?私は、の値が思ったInteger iことがあることから、連載されていませんstatic

第二版:シリアル化と二つの異なる実行でデシリアライズ。

私が最初に実行する場合:

public static void main(String[] args)  {
        try {
            // Serialization
            writeFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

そして、セカンドランで:

public static void main(String[] args)  {
        try {
            // Deserialization
            Test deserializedFile = readFile();
            System.out.println(deserializedFile.i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

これは、出力null私が示唆したように、最初のバージョンすぎ。

違いはどこにあるの?

GhostCat敬礼モニカC.:

シンプル:それは静的変数です。あなたは、コンストラクタを使用してのインスタンスを作成するときには、あなたの最初の例では初期化されます!

第二の例では、コンストラクタが呼び出されないことを、フィールド滞在はヌル!

つまり、こので全部です。そして、あなたは自分で言ったように:静的フィールドがされていないそのファイルに書き込まれます。あなたの二つの例では唯一の問題は、1つのバージョンのコンストラクタを呼び出し、他にはないということです。

それ以上に、ここでもう一つの誤解があります:あなたが書いたdeserializedFile.iを ...つまり、概念的に間違っています。あなたは使うべきTest.iを代わりに。静的変数は、すべてのインスタンスで同じです、彼らの所有する範囲は、Testクラスではなく、そのクラスのいくつかのインスタンスであります!

そして、ちょうどレコードの:deserializedFileは非常に誤解を招く名前です。その変数は、デシリアライズテストオブジェクトを表します。それはないファイルに!名前は、彼らがおよそなく嘘が何であるかを言う必要があります。この名前は、大きな時間をあります!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=232908&siteId=1