this document에 따르면 열거 형 상수의 필드는 serialize되지 않습니다. 그래서 나는 다음과 같은 데모를 함께 넣어 : 나는 42
로 출력을 기다리고 있었다열거 형 필드가 직렬화되는 이유는 무엇입니까?
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
enum EnumBasedSingleton
{
INSTANCE;
EnumBasedSingleton() {
value = 42;
}
int value;
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}
}
class EnumBasedSingletonDemo
{
static void saveToFile(EnumBasedSingleton singleton, String filename)
throws Exception
{
try (FileOutputStream fileOut = new FileOutputStream(filename);
ObjectOutputStream out = new ObjectOutputStream(fileOut))
{
out.writeObject(singleton);
}
}
static EnumBasedSingleton readFromFile(String filename)
throws Exception
{
try (FileInputStream fileIn = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(fileIn))
{
return (EnumBasedSingleton)in.readObject();
}
}
public static void main(String[] args)
throws Exception
{
EnumBasedSingleton singleton = EnumBasedSingleton.INSTANCE;
singleton.setValue(111);
String filename = "myfile.bin";
saveToFile(singleton, filename);
EnumBasedSingleton singleton2 = readFromFile(filename);
System.out.println(singleton2.getValue());
}
}
을하지만 내가 가진 것은 111
입니다. 내가 문서를 오해하고 있거나 enum 상수의 필드가 직렬화되어 있습니까? Java 9에서 이것을 실행하고 있습니다.
42 세가 예상되는 이유는 무엇입니까? – shmosel
생성자가이 값을 지정하므로 @shmosel –
열거 형은 싱글 톤입니다. 이 문서는 다음과 같이 말합니다 _ enum 상수의 직렬화 된 형식은 이름만으로 구성됩니다. _ 직렬화 중에 이름이 열거 형 상수를 이름으로 결정하는 데 사용됩니다. 해당 enum 상수는 현재 프로세스에서 111의 값을가집니다. 생성자가 호출되지 않습니다. –