我有一个设置类,我希望能够序列化和反序列化以保存和加载设置到文件。
事后看来,我已经设计了我的整个应用程序,以便在需要时创建设置实例。实际上,我的设置是持久的(模仿默认的应用程序设置行为)。鉴于我目前的架构,我可以做到以下几点:
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);
}
但有没有办法更新当前类的所有公共属性以匹配反序列化对象的属性?
(我想更普遍的问题是:“有没有一种有效的方法可以根据另一个类的内容更新一个类?”)
答案 0 :(得分:3)
我会将设置类设为singelton并为其设置静态实例 那么你可以调用load并保存在那个实例上
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);
}
}
答案 1 :(得分:2)
我会使用静态方法
MyClass myclass = MyClass.Load("settings.xml")
否则你可以用反射来实现。
通过google发现此示例:http://www.csharp-examples.net/reflection-examples/
答案 2 :(得分:0)
另一个选项是AutoMapper。