• WPF 分享一种设置程序保存配置文件的方法


    最近需要做一个配置程序,主要给其他程序做相关配置的小工具。

    配置项蛮多的,一般我们都是将各个配置项写到配置文件的节点中,比如App.config文件或者自定义的xml文件。

    因为我用的是wpf,MVVM,所以其实界面上的所有数据我都存着ViewModel的实体属性中。比如我们新建一个Model,叫SettingModel,界面上不管做任何更改,其实数据都和SettingModel中一样。

    我们将这个SettingModel的内存数据序列化到本地文件。等下次运行程序时,再去反序列化将SettingModel的数据加载到ViewModel中。

      public class SettingModel:ObservableObject
        {
            private string _FConnStr;
    
            public string FConnStr
            {
                get { return _FConnStr; }
                set { _FConnStr = value; RaisePropertyChanged("FConnStr"); }
            }
    
    
            private string _DBType;
    
            public string DBType
            {
                get { return _DBType; }
                set { _DBType = value; RaisePropertyChanged("DBType"); }
            }
    
            private string _SupplierName;
    
            public string SupplierName
            {
                get { return _SupplierName; }
                set { _SupplierName = value; RaisePropertyChanged("SupplierName"); }
            }
    
            private string _SupplierNo;
    
            public string  SupplierNo
            {
                get { return _SupplierNo; }
                set { _SupplierNo = value; RaisePropertyChanged("SupplierNo"); }
            }
    
            private List<ComboxModel> _SQLList;
    
            public List<ComboxModel> SQLList
            {
                get { return _SQLList; }
                set { _SQLList = value; RaisePropertyChanged("SQLList"); }
            }
    
            private string _StartTime;
    
            public string StartTime
            {
                get { return _StartTime; }
                set { _StartTime = value; RaisePropertyChanged("StartTime"); }
            }
    
            private string _EndTime;
    
            public string EndTime
            {
                get { return _EndTime; }
                set { _EndTime = value; RaisePropertyChanged("EndTime"); }
            }
    
            private int _Rate;
    
            public int Rate
            {
                get { return _Rate; }
                set { _Rate = value; RaisePropertyChanged("Rate"); }
            }
    
            private DateTime _TransmissionDate;
    
            public DateTime TransmissionDate
            {
                get { return _TransmissionDate; }
                set { _TransmissionDate = value; RaisePropertyChanged("TransmissionDate"); }
            }
    
            private string _ServiceAddress;
    
            public string ServiceAddress
            {
                get { return _ServiceAddress; }
                set { _ServiceAddress = value; RaisePropertyChanged("ServiceAddress"); }
            }
    
        }
    View Code

    序列化和反序列化方法

           public static void MySerialize<T>(T s)
            {
                FileStream fileStream = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "/Config/config.dat", FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fileStream, s);
                fileStream.Close();
    
            }
            //T 可以是类型    
            public static T MyBackSerialize<T>(string path)
            {
                FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                BinaryFormatter formatter = new BinaryFormatter();
                T s = (T)formatter.Deserialize(fileStream);
                fileStream.Close();
                return s;
            }

    但是实行过程中遇到个问题,因为使用了MVVM,Model都实现了INotifyPropertyChanged接口。但是序列化的时候不可以序列化。

    于是我们需要再添加一个Model,结构和SettingModel一样,但是不实现INotifyPropertyChanged接口。

     [Serializable]
        public class SettingModelBack
        {
            private string _FConnStr;
    
            public string FConnStr
            {
                get { return _FConnStr; }
                set { _FConnStr = value;}
            }
    
    
            private string _DBType;
    
            public string DBType
            {
                get { return _DBType; }
                set { _DBType = value;}
            }
    
            private string _SupplierName;
    
            public string SupplierName
            {
                get { return _SupplierName; }
                set { _SupplierName = value; }
            }
    
            private string _SupplierNo;
    
            public string SupplierNo
            {
                get { return _SupplierNo; }
                set { _SupplierNo = value;  }
            }
    
            private List<ComboxModelBack> _SQLList;
    
            public List<ComboxModelBack> SQLList
            {
                get { return _SQLList; }
                set { _SQLList = value; }
            }
    
            private string _StartTime;
    
            public string StartTime
            {
                get { return _StartTime; }
                set { _StartTime = value; }
            }
    
            private string _EndTime;
    
            public string EndTime
            {
                get { return _EndTime; }
                set { _EndTime = value; }
            }
    
            private int _Rate;
    
            public int Rate
            {
                get { return _Rate; }
                set { _Rate = value;  }
            }
    
            private DateTime _TransmissionDate;
    
            public DateTime TransmissionDate
            {
                get { return _TransmissionDate; }
                set { _TransmissionDate = value; }
            }
    
    
            private string _ServiceAddress;
    
            public string ServiceAddress
            {
                get { return _ServiceAddress; }
                set { _ServiceAddress = value; }
            }
        }
    View Code

    此Model类上添加 [Serializable]标记。

    这样我们在保存时,需要将SettingModel的数据赋给SettingModelBack,我们可以用AutoMapper来实现,很方便。

       private void Save()
            {
                var config = AutoMapper.Mapper.Map<SettingModelBack>(Master);
    
                MySerialize<SettingModelBack>(config);
    
                dialogCoordinator.ShowMessageAsync(this, "", "保存成功!");
            }

    我们在应用程序中,想读取配置文件中的信息,我们可以反序列化配置文件,将数据还原到Model中。

     string path = AppDomain.CurrentDomain.BaseDirectory + "/Config/config.dat";
    
     var configData= MyBackSerialize<SettingModelBack>(path);

    这种保存配置文件的方式,有个好处就是如果有新的配置项需要保存,我们只需要在Model中添加相应的属性,并绑定到界面上(WPF本来也需要做这个事),而不需要再去写创建新节点,修改新节点的代码。但是也有个不方便的地方,就是不可以在文本中修改配置文件了,只能通过配置工具修改,因为保存到本地config.dat中的文件打开后是乱码了。

  • 相关阅读:
    重载
    两数之和
    求二叉树层序遍历
    最小的K的个数
    二分查找
    实现二叉树先序,中序,后序
    判断 链表中是否有环
    设计LRU缓存结构
    排序
    反转链条
  • 原文地址:https://www.cnblogs.com/czly/p/10004621.html
Copyright © 2020-2023  润新知