代码之家  ›  专栏  ›  技术社区  ›  Tom Wright

是否可以反序列化到当前类?

  •  0
  • Tom Wright  · 技术社区  · 15 年前

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

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

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

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

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   Jürgen Steinblock    15 年前

    我会使用静态方法

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

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

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

        2
  •  3
  •   LiFo    15 年前

    我将使设置类成为一个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);
        }
    }
    
        3
  •  0
  •   Tim S.    14 年前

    另一个选择是 AutoMapper .