2011-12-19 56 views
1

我在我的.NET CF應用程序中有配置實體,我想爲此使用單例。配置可以更改,並且必須保存/恢復以便下次啓動應用程序。我想使用xml序列化/反序列化,它也提供了通過xml文件更改配置的可能性。 問題是如何保存和恢復單身人士?反序列化創建了一個單例類的新實例,但這意味着它現在是單例類的兩個實例。如何保存/加載單例類

我已經發現了與ISerializable接口的解決方案,但它似乎不緊湊框架 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable%28v=VS.90%29.aspx

有什麼辦法獲得與.NET CF相同的行爲工作?

+1

爲什麼會有兩個實例?當您的應用程序加載時,它可以立即反序列化單例類,並且這將是您唯一的實例。沒有? – 2011-12-19 13:57:55

回答

3

你的單例最有可能在其模式中使用私有構造函數。所以,你會做這樣的事情:

public class MySingleton 
{ 
    private static MySingleton m_instance; 

    private MySingleton() { } 

    public static MySingleton Instance 
    { 
     get 
     { 
      if(m_instance == null) 
      { 
       // hydrate m_instance from serialized version 
      } 
      return m_instance; 
     } 
    } 
} 

或本:

public class MySingleton 
{ 
    private static MySingleton m_instance; 

    private MySingleton() 
    { 
     // load data from config file 
    } 

    public static MySingleton Instance 
    { 
     get 
     { 
      if(m_instance == null) 
      { 
       m_instance = new MySingleton(); 
      } 
      return m_instance; 
     } 
    } 
} 
+0

是的,我理解Singleton模式,但配置可能會在緊湊框架應用程序之外進行更改,例如從主機PC。在這種情況下,我必須將xml文件反序列化爲一個新的單例實例,並將現有的實例替換爲新實例。據我瞭解,MS示例的ISerializable接口允許將xml反序列化到現有的單例實例,而不是創建新實例。所以我想在.NET CF中這樣的東西。可能嗎? – wince 2011-12-19 18:48:16

+0

我不明白這個問題。你想在運行時用另一個替換現有的單例實例嗎?如果是這樣,請替換'm_instance'實例(用它附近的鎖)。序列化/反序列化方法與它是否是單例無關。如果你想知道如何序列化反序列化在桌面和CF上兼容的東西,那麼這是一個完全不同的問題。 – ctacke 2011-12-19 20:03:15

+0

是的,我想在運行時替換現有的實例。我的問題是取代m_instance我的任務的一個很好的解決方案,或者它打破單身模式? – wince 2011-12-20 04:27:50