Я пытаюсь выяснить (де /) сериализацию в 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
, как я предложил в в первой версии тоже.
В чем разница?!