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

配置项蛮多的,一般我们都是将各个配置项写到配置文件的节点中,比如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"); }
} }

序列化和反序列化方法

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

此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中的文件打开后是乱码了。

WPF 分享一种设置程序保存配置文件的方法的更多相关文章

  1. WPF 分享一种背景动画效果

    今天看微软的一个Samples,发现一个蛮好玩的背景样式,如下图所示: 风格比较卡哇伊. <Window x:Class="WPFSamplesTest.MainWindow" ...

  2. 转:CentOS设置程序开机自启动的方法

    转自:http://www.centos.bz/2011/09/centos-setup-process-startup-boot/ 1.把启动程序的命令添加到/etc/rc.d/rc.local文件 ...

  3. CentOS设置程序开机自启动的方法

    转自:http://www.centos.bz/2011/09/centos-setup-process-startup-boot/ 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. ...

  4. 两种设置WebLogic启动内存的方法

    我们经常在使用WebLoigc部署应用程序后,发现程序运行速度并不是很快,遇到这种情况我们可以尝试调整启动时分配的内存,设置方法有两种:    一.在..\domain\startWebLoigc.* ...

  5. php 分享两种给图片加水印的方法

    本文章向码农们介绍 php 给图片加水印的两种方法,感兴趣的码农可以参考一下本文章的源代码. 方法一:PHP最简单的加水印方法 <?php // http://www.manongjc.com ...

  6. screen mac linux下一种让程序后台运行的方法

    1: screen 场景的意思.字面意思就是软件运行在不同场景 (1)创建会话 使用命令“screen -S RunWork”来创建一个screen会话,命令执行之后,就会得到一个新的shell窗口, ...

  7. SessionState的几种设置

    SessionState:   web Form 网页是基于HTTP的,它们没有状态, 这意味着它们不知道所有的请求是否来自同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息 ...

  8. 5种设置ASP.NET Core应用程序URL的方法

    默认情况下,ASP.NET Core应用程序监听以下URL: http://localhost:5000 https://localhost:5001 在这篇文章中,我展示了5种不同的方式来更改您的应 ...

  9. (11)Web程序保存状态的几种方式,Application,Session,Cookie,ViewState

    WEb程序保存状态的方式有这样几种: 1.Application:保存在Application中的数据是全局有效的:Application里面存放的应该是访问多修      改较少并且是全局至少大部分 ...

随机推荐

  1. 关于diskgenius删除所有分区后,电脑不能识别U盘的问题。

    楼主曾今为了将Linux系统安装至U盘中,曾无数次对U盘进行过格式化,到最后导致,u盘各种引导.系统.烂数据存在U盘,导致U盘的使用越来越不方便.后来终于下狠心,利用diskgenius对U盘进行一次 ...

  2. strongswan

    StrongSwan is an open source IPsec-based VPN Solution. It supports both the IKEv1 and IKEv2 key exch ...

  3. lamp。查看版本

    [root@localhost ~]# php -vPHP 5.2.16 (cli) (built: Dec 17 2010 14:09:03) Copyright (c) 1997-2010 The ...

  4. Selection II

    [Selection II] 1.上.下.左.右键可以移动Selection 1个像素.按住Shift键,可以一次移动10个像素. 2.Add Selection模式的快捷键是Shift,Sub Se ...

  5. LUA Metatables

    __index:当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法,如果不存在,则返回nil,如果存在,则返回结果. 博主注:__index有点像异常处理的意思 __newindex ...

  6. Shrio04 自定义Realm

    1 说明 1.1 Realm的作用 Realm和认证和授权时的数据交互有关,相当于DAO层. 1.2 AuthorizingRealm >层次关系图 >作用继承AuthorizingRea ...

  7. WebBrowser介绍——Javascript与C++互操作

    WebBrowser控件是Microsoft提供的一个用于网页浏览的客户端控件,WebBrowser控件的使用相当广泛,例如很多邮件客户端都是使用可编辑的WebBrowser控件作为写邮件的工具,也有 ...

  8. sql产生随机数字

    第一种:select cast(ceiling(rand() * 10) as int)第二种:select cast(ceiling(rand(checksum(newid()))*10) as i ...

  9. sqlserver 开窗函数Over()的使用

    利用over(),将统计信息计算出来,然后直接筛选结果集 declare @t table(ProductID int,ProductName varchar(20),ProductType varc ...

  10. Ubuntu在命令行下将默认语言改为英语

    将Ubuntu安装成中文版,需要将默认语言改为英文. 用vi(或nano等文本编辑器)打开 /etc/default/locale 文件 将原来的配置内容修改为 LANG=”en_US.UTF-8″ ...