私は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
私が示唆したように、最初のバージョンすぎ。
違いはどこにあるの?
シンプル:それは静的変数です。あなたは、コンストラクタを使用してのインスタンスを作成するときには、あなたの最初の例では初期化されます!
第二の例では、コンストラクタが呼び出されないことを、フィールド滞在はヌル!
つまり、こので全部です。そして、あなたは自分で言ったように:静的フィールドがされていないそのファイルに書き込まれます。あなたの二つの例では唯一の問題は、1つのバージョンのコンストラクタを呼び出し、他にはないということです。
それ以上に、ここでもう一つの誤解があります:あなたが書いたdeserializedFile.iを ...つまり、概念的に間違っています。あなたは使うべきTest.iを代わりに。静的変数は、すべてのインスタンスで同じです、彼らの所有する範囲は、Testクラスではなく、そのクラスのいくつかのインスタンスであります!
そして、ちょうどレコードの:deserializedFileは非常に誤解を招く名前です。その変数は、デシリアライズテストオブジェクトを表します。それはないファイルに!名前は、彼らがおよそなく嘘が何であるかを言う必要があります。この名前は、大きな時間をあります!