【问题标题】:Is it possible to deserialize to the current class?是否可以反序列化为当前类?
【发布时间】:2011-03-14 06:00:20
【问题描述】:

我有一个设置类,我希望能够对其进行序列化和反序列化以将设置保存并加载到文件中。

事后看来,我会设计我的整个应用程序以在需要时创建设置实例。事实上,我的设置是持久的(模仿默认的应用程序设置行为)。鉴于我目前的架构,我可以执行以下操作:

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);
}

但是有没有办法更新当前类的所有公共属性以匹配反序列化对象的公共属性?

(我想更一般的问题是:“有没有一种有效的方法可以根据另一个类的内容更新一个类?”)

【问题讨论】:

    标签: c# xml serialization object


    【解决方案1】:

    我会将设置类设为单例,并为其设置一个静态实例 然后您可以调用该实例的加载和保存

    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);
        }
    }
    

    【讨论】:

    • 这也是我推荐的。隐藏静态访问属性后面的加载细节。附带说明:流应包含在 using 语句中,以确保正确清理。
    • 在重新分配_instance = (MySettings)x.Deserialize(stream) 时,单例模式没有损坏吗?在应用程序的某个地方会有以前的单例实例吗?
    【解决方案2】:

    我会使用静态方法

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

    否则你可以通过反射来实现。

    通过谷歌找到这个例子:http://www.csharp-examples.net/reflection-examples/

    【讨论】:

    • 谢谢,最终选择了前一个选项。
    【解决方案3】:

    另一个选项是AutoMapper

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2010-10-11
      • 2016-01-09
      • 1970-01-01
      相关资源
      最近更新 更多