Ответ
Сериализация Singleton требует особого подхода, чтобы избежать создания дубликатов при десериализации. Решение — реализовать readResolve():
object Singleton : Serializable {
// Защита от создания дубликата при десериализации
private fun readResolve(): Any = Singleton
}
Или для Java-стиля:
public class Singleton implements Serializable {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
// Критически важный метод для сохранения Singleton
protected Object readResolve() {
return INSTANCE;
}
}
При десериализации JVM вызывает readResolve(), возвращая существующий экземпляр вместо создания нового. Также можно использовать enum — они по умолчанию корректно обрабатывают сериализацию.