Сериализация Singleton без утраты его сути
Last updated: 7 мая 2025 г.Cинглтон
это класс, который может иметь только один экземпляр. То есть другой экземпляр этого класса невозможно создать.
Если мы сериализуем этот экземпляр, а потом десериализуем, то получим уже второй экземпляр синглтона, что противоречит идее синглтона.
Чтобы десериализовался тот же экземпляр нужно определить метод re
adResolve
.
Пример программы:
1import java.io.*;
2
3//класс синглтон
4class Singleton implements Serializable {
5
6 public static Singleton instance = new Singleton();
7 //приватный конструктор нужен
8 //чтобы невозможно было создавать
9 //объект данного класса вне класса Singleton.
10 //то есть выше мы создали один объект
11 //и больше ни одного создаваться не будет
12 private Singleton() {
13 }
14
15 // private constructor
16
17 //Все что нужно сделать это определить
18 //в классе синглтона метод с именем readResolve
19 //вот так как ниже и сериализоваться
20 //в итоге будет тот же объект синглтона
21 protected Object readResolve() {
22 return instance; } //возвращает этот же объект
23}
24
25public class SingletonSer {
26
27 public static void main(String[] args) {
28
29 try {
30 //снизу обычная сериализация.
31 //как в прошлых уроках
32 Singleton instance1 = Singleton.instance;
33 ObjectOutput out = new ObjectOutputStream(
34 new FileOutputStream("file.text"));
35
36 out.writeObject(instance1);
37 out.close();
38
39 ObjectInput in = new ObjectInputStream(
40 new FileInputStream("file.text"));
41 Singleton instance2
42 = (Singleton) in.readObject();
43 in.close();
44
45 //теперь instance1 и instance2 возвращают один
46 //и тот же hashCode что значит
47 //что это один и тот же экземпляр
48 System.out.println("instance1 hashCode:- "
49 + instance1.hashCode());
50 System.out.println("instance2 hashCode:- "
51 + instance2.hashCode());
52 }
53
54 catch (Exception e) {
55 e.printStackTrace();
56 }
57 }
58}
Вывод:

Как видим, instance1 и instance2 возвращают один и тот же hashCode, что значит, что это один и тот же экземпляр, что значит, что концепция синглтона не нарушается.
Следующие уроки
Управляемая сериализация в Java: Externalizable
10
мин.
Базы данных: основные принципы
13
мин.
Связь Один-ко-Многим в базах данных
14
мин.