Реализация метода readResolve() для сериализуемого экземпляра SingletonJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Реализация метода readResolve() для сериализуемого экземпляра Singleton

Сообщение Anonymous »

Я пытаюсь написать сериализуемый класс Singleton, добавив метод readResolve(). Мое намерение состоит в том, чтобы получить тот же объект с состоянием его объекта на момент сериализации.
ниже приведен пример кода моего теста:

Код: Выделить всё

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SingletonDemo {

public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("After NEW Object creation : " + obj);

obj.i = 5;
System.out.println("Object modified");
System.out.println("After Object 1st Modification : " + obj);

serializeMe();
System.out.println("Serialized successfully with object state : " + obj);

obj.i = 10;
System.out.println("Object modified again");
System.out.println("After Object 2nd Modification : " + obj);

Singleton st = (Singleton)deSerializeMe();
System.out.println("Deserialized successfully");

System.out.println("After Deserialization : " + st);
}

public static void serializeMe() {
ObjectOutputStream oos = null;

try {
oos = new ObjectOutputStream(new FileOutputStream("d:\\SingletonData.txt"));
oos.writeObject(MySerializedSingleton.getInstance());
} catch (IOException e) {
e.printStackTrace();
}
}

public static Object deSerializeMe() {
ObjectInputStream oin = null;
Object obj = null;

try {
oin = new ObjectInputStream(new FileInputStream("d:\\SingletonData.txt"));
obj = oin.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();

}
return obj;
}

Код: Выделить всё

class Singleton implements Serializable {
int i;
private static Singleton obj = null;

private Singleton() {
System.out.println("Executing constructor");
i=1;
}

public static Singleton getInstance() {
if(obj == null) {
obj = new Singleton();
}
System.out.println("An instance is returned");
return obj;
}

/*private void writeObject(ObjectOutputStream oos) {
try {
oos.writeInt(i);
} catch (Exception e) {
e.printStackTrace();
}
}

private void readObject(ObjectInputStream ois) {
try {
i = ois.readInt();
} catch (Exception e) {
e.printStackTrace();
}
}*/

public Object readResolve() {
System.out.println("Executing readResolve");
return Singleton.getInstance(); // FIXME
}

@Override
public String toString() {
return "Singleton [i=" + i + "]";
}
}
ВЫВОД:

Код: Выделить всё

Executing constructor
An instance is returned
After NEW Object creation : Singleton [i=1]
Object modified
After Object 1st Modification : Singleton [i=5]
An instance is returned
Serialized successfully with object state : Singleton [i=5]
Object modified again
After Object 2nd Modification : Singleton [i=10]
Executing readResolve
An instance is returned
Deserialized successfully
After Deserialization : Singleton [i=10]
Я знаю, что текущий сценарий всегда будет возвращать один и тот же экземпляр Singleton с последним состоянием объекта.
Я попробовал переопределить writeObject() и readObject () (прокомментировано в приведенном выше коде), но не получает желаемого результата.
т.е.

Код: Выделить всё

After Deserialization : Singleton [i=5]
Но в readResolve() нет ссылки на ObjectInputStream, поэтому я могу получить экземпляр и обновить его с учетом состояния сериализованного объекта перед возвратом.
Пожалуйста, поправьте меня, если я ошибаюсь в своей концепции, и помогите мне решить эту проблему.
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/173 ... n-instance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»