如果我將類'A'定義爲單例表示,我只能創建類「A」的一個對象。如果我將它作爲Serializable並將其序列化,那麼如何實現同一對象的Singleton狀態?如何維護序列化對象上的Singleton狀態?
1
A
回答
1
任何對象一個方法的反序列化之前被稱爲是的readResolve(),所以我們可以簡單地從該方法返回相同的狀態對象不實際反序列化它。
請參考下面,
public final class MySingleton {
private MySingleton() { }
private static final MySingleton INSTANCE = new MySingleton();
public static MySingleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
// instead of the object we're on,
// return the class variable INSTANCE
return INSTANCE;
}
}
1
3
引用Effective Java #77
,你應該看看實施readResolve
方法。
readResolve功能允許用另一個實例代替readObject [Serialization,3.7]創建的一個 。如果正在反序列化的對象的類定義了具有正確聲明的readResolve方法,則在對新創建的對象進行反序列化後,該方法將調用 。然後返回由此方法返回的對象引用 而不是新創建的對象。在 此功能的大多數用途中,不保留對新創建對象的引用,因此它立即變爲符合垃圾回收的條件。
public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
// readResolve for instance control - you can do better!
private Object readResolve() {
//Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE;
}
}
+0
感謝Manoj,這真的很有幫助。 – Amol
相關問題
- 1. 如何維護序列化對象?
- 2. 維護php對象狀態
- 3. 在JavaScript中維護對象狀態DOJO
- 4. 通過序列化/反序列化維護對象引用
- 5. 在維護對象引用的同時序列化C#對象
- 6. jquery插件如何維護對象的狀態
- 7. 序列化 - 如何保護序列化的JAVA對象?
- 8. 記錄對象狀態序列化
- 9. 會話序列化後維護XML文檔狀態
- 10. Singleton Class Vs序列化對象,CSharp
- 11. 如何維護複選框的狀態
- 12. 如何維護搜索portlet的狀態
- 13. 如何維護活動的狀態?
- 14. 彈簧相當於EJB Singleton維護狀態
- 15. 維護與序列化的對象關係映射
- 16. 維護狀態的管道
- 17. Http Get - 如何維護狀態?
- 18. 如何在Silverlight中維護狀態?
- 19. Azure如何維護APPLICATION狀態?
- 20. 如何維護鼠標懸停狀態?
- 21. Java Servlets之間如何維護狀態?
- 22. 如何序列化動態對象?
- 23. 維護列表項狀態:hover
- 24. 使用PHP維護不同頁面的對象狀態
- 25. 如何序列化和反序列化靜態引用對象?
- 26. 骨幹維護狀態
- 27. 維護視圖狀態
- 28. 維護視圖狀態POST
- 29. 維護ListView項目狀態
- 30. 維護私有狀態
如何序列化過程中交織與辛格爾頓概念,你的意思? – Andremoniy
如果我序列化任何對象意味着我保存了對象的狀態,然後我反序列化它,我得到具有相同狀態的新對象,但它仍然是一個新對象,所以我如何才能實現Singleton狀態?所以有兩個對象,一個是序列化的,另一個是上下文。 – Amol
在對任何對象進行反序列化之前,一個被調用的方法是readResolve,因此我們可以簡單地從該方法返回相同的對象。 – Amol