2010-07-10 2 views
0

У меня есть класс настроек, который я хочу, чтобы иметь возможность сериализации и десериализации для сохранения и загрузки настроек в файл.Можно ли десериализовать текущий класс?

Оглядываясь назад, я бы разработал все мое приложение, чтобы создать экземпляр настроек, когда это необходимо. Как бы то ни было, мои настройки являются постоянными (имитируя поведение настроек приложений по умолчанию). Учитывая мои нынешние архитектуры, я могу сделать следующее:

public void Save() 
{ 
    Stream stream = File.Open("settings_test.xml", FileMode.Create); 
    XmlSerializer x = new XmlSerializer(this.GetType()); 
    x.Serialize(stream, this); 
} 

Очевидно, что я не могу сделать это:

public void Load() 
{ 
    Stream stream = File.Open("settings_test.xml", FileMode.Open); 
    XmlSerializer x = new XmlSerializer(this.GetType()); 
    this = x.Deserialize(stream); 
} 

Но есть способ обновить все открытые свойства тока класс, который соответствует классу десериализованного объекта?

(я полагаю, более общие вопросы это: «Есть ли эффективный способ обновить один класс на основе содержимого другого?»)

ответ

2

Я хотел бы использовать статический метод

MyClass myclass = MyClass.Load("settings.xml") 

В противном случае вы можете добиться этого с отражением.

Найдено этот пример с помощью Google: http://www.csharp-examples.net/reflection-examples/

+0

Спасибо, закончил тем, что пошел на прежний вариант. –

3

Я хотел бы сделать класс настроек учетной singelton и иметь статический экземпляр к нему , то вы могли бы назвать груз и сэкономить на этом экземпляре

public class MySettings 
{ 
    private static MySettings _instance; 
    public static MySettings Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new MySettings(); 
       // maby call Load(); 
      } 
      return _instance; 
     } 
    } 
    private MySettings() 
    { 
     //set default values 
    } 

    public void Load() 
    { 
     Stream stream = File.Open("settings_test.xml", FileMode.Open); 
     XmlSerializer x = new XmlSerializer(this.GetType()); 
     _instance = (MySettings)x.Deserialize(stream); 
    } 

    public void Save() 
    { 
     Stream stream = File.Open("settings_test.xml", FileMode.Create); 
     XmlSerializer x = new XmlSerializer(this.GetType()); 
     x.Serialize(stream, _instance); 
    } 
} 
+0

Это то, что я бы рекомендовал, тоже. Скрыть сведения о загрузке за свойством статического доступа. Одностороннее примечание: поток должен быть завернут в оператор using, чтобы обеспечить правильную очистку. – ollb

+0

При этом переназначении '_instance = (MySettings) x.Deserialize (stream)' нет одноэлементного шаблона? Как где-то в приложении будет предыдущий экземпляр singleton? –

Смежные вопросы