Gemäß this document sind die Felder der Enum-Konstanten nicht serialisiert. Also habe ich die folgende Demo zusammen:Warum werden meine enum-Felder serialisiert?
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());
}
}
ich die Ausgabe erwartete 42
zu sein, aber was ich habe ist 111
. Missverstehe ich das Dokument oder sind Felder von Enum-Konstanten serialisiert? Ich verwende dies in Java 9.
Warum haben Sie 42 erwartet? – shmosel
@smossel, weil der Konstruktor diesen Wert angibt –
Enums sind Singletons. Das Dokument sagt _Die serialisierte Form einer Enum-Konstante besteht nur aus ihrem Namen _ Es folgt, dass während der Deserialisierung der Name verwendet wird, um die Enum-Konstante anhand des Namens zu bestimmen. Diese Enum-Konstante hat in Ihrem aktuellen Prozess einen Wert von 111. Es wird kein Konstruktor aufgerufen. –