用RTTI处理程序配置信息
2009-04-27 16:15
246 查看
一般来说,程序多少都会有一些自己的配置信息要保存,不论是通常用的保存到INI还是注册表,或者是XML甚至YAML,总归是要写不少代码处理的。
问题的麻烦在于,程序中实现操作配置信息通常并不需要关注它是保存在什么地方,以什么格式保存,但是传统的方法不论是调用TIniFile还是TRegistry或者是DOM,都是需要开发者花一些时间精力浪费在这上面。
我前一阵写个小程序,不高兴弄配置这些麻烦事,于是利用前些年写的一个框架代码,实现了一套通用的配置序列化机制,这样配置信息管理起来就方便多了。
代码详见MDConfig单元。
基本组成是这样:
TMCustomConfigSection
类实现了IMSerializable接口(定义在框架的MDComm中),意味着它可以被递归序列化——不过在已实现的INI文件和注册表文件序列化
中,这种递归仅限于一层:即一个配置文件可以包括多个配置段,但是配置段下不能再有配置段。当然,框架中实现的通用序列化(二进制和XML)不受此限。
TMCustomConfig类则是可序列化的配置文件,派生自TPersistent。这个类里除了可以包含配置信息以外,还可以包括配置段。
TMCustomConfigSerializer类则是配置序列化基类,实现配置序列化的公共部分——即与具体序列化方式无关的部分。
TMIniSerializer类是INI文件的序列化类,通过它可以把配置文件序列化到INI文件中去。
TMRegSerializer类是注册表序列化类。
配置的基本使用方法是这样的:
分别从TMCustomConfigSection和TMCustomConfig派生自己的配置段类和配置类,在其中定义配置项目供程序使用。示例代码如:
序
列化方式则可以自由选择目前已经实现的四种:INI文件,注册表,二进制文件,XML。序列化操作也可以选择默认序列化或是指定序列化。默认序列化就是在
Config对象构造时传入默认的序列化方式,指定序列化就是在调用Config对象的Load/Save方法时指定序列方式。当然,即使设置了默认序列
化方式,也是可以在调用Load/Save方法时重新指定的。
默认序列化:
指定序列化:
注意,其中序列化器是通过引用计数维护的,会自动释放,不需要显示释放。
mdf框架全部源码下载。
只使用配置序列化部分的话,只需要MDComm和MDConfig两个单元文件(二进制和XML序列化需要MSerializ单元)。
在BCB中使用的特别注意事项:
要用一个Delphi单元来定义配置类,因为用到了Delphi的RTTI,虽然用C++来写配置类也可以编译,但是会发生运行时错误。特别关键的是序列化器对象必须在Delphi单元中创建。形如:
问题的麻烦在于,程序中实现操作配置信息通常并不需要关注它是保存在什么地方,以什么格式保存,但是传统的方法不论是调用TIniFile还是TRegistry或者是DOM,都是需要开发者花一些时间精力浪费在这上面。
我前一阵写个小程序,不高兴弄配置这些麻烦事,于是利用前些年写的一个框架代码,实现了一套通用的配置序列化机制,这样配置信息管理起来就方便多了。
代码详见MDConfig单元。
基本组成是这样:
TMCustomConfigSection
类实现了IMSerializable接口(定义在框架的MDComm中),意味着它可以被递归序列化——不过在已实现的INI文件和注册表文件序列化
中,这种递归仅限于一层:即一个配置文件可以包括多个配置段,但是配置段下不能再有配置段。当然,框架中实现的通用序列化(二进制和XML)不受此限。
TMCustomConfig类则是可序列化的配置文件,派生自TPersistent。这个类里除了可以包含配置信息以外,还可以包括配置段。
TMCustomConfigSerializer类则是配置序列化基类,实现配置序列化的公共部分——即与具体序列化方式无关的部分。
TMIniSerializer类是INI文件的序列化类,通过它可以把配置文件序列化到INI文件中去。
TMRegSerializer类是注册表序列化类。
配置的基本使用方法是这样的:
分别从TMCustomConfigSection和TMCustomConfig派生自己的配置段类和配置类,在其中定义配置项目供程序使用。示例代码如:
TMTestConfigSection = class(TMCustomConfigSection) Private FStringItem : String; FIntItem : Integer; FFloatItem : Double; FDateItem : TDateTime; Published Property StringItem : String Read FStringItem Write FStringItem; Property IntItem : Integer Read FIntItem Write FIntItem; Property FloatItem : Double Read FFloatItem Write FFloatItem; Property DateItem : TDateTime Read FDateItem Write FDateItem; End; TMTestConfig = class(TMCustomConfig) Private FSectionItem : TMTestConfigSection; FStringItem : String; public Constructor Create(aDefaultSerializer : IMSerializer = Nil); destructor Destroy; Override; Published Property SectionItem : TMTestConfigSection Read FSectionItem Write FSectionItem; Property StringItem : String Read FStringItem Write FStringItem; End; Constructor TMTestConfig.Create(aDefaultSerializer : IMSerializer = Nil); begin Inherited Create(aDefaultSerializer); FSectionItem := TMTestConfigSection.Create(); end; destructor TMTestConfig.Destroy; begin FSectionItem.Free; Inherited end;
序
列化方式则可以自由选择目前已经实现的四种:INI文件,注册表,二进制文件,XML。序列化操作也可以选择默认序列化或是指定序列化。默认序列化就是在
Config对象构造时传入默认的序列化方式,指定序列化就是在调用Config对象的Load/Save方法时指定序列方式。当然,即使设置了默认序列
化方式,也是可以在调用Load/Save方法时重新指定的。
默认序列化:
conf := TMTestConfig.Create(TMIniSerializer.Create('e:/temp/test.ini')); conf.StringItem := 'This is default section item'; conf.SectionItem.StringItem := 'This is Section item'; conf.SectionItem.IntItem := 12345; conf.SectionItem.FloatItem := 9.87654; conf.SectionItem.DateItem := EncodeDate( 2009, 01, 02 ); conf.Save;
指定序列化:
conf := TMTestConfig.Create; conf.Load(TMIniSerializer.Create('e:/temp/test.ini')); conf.Save(TMRegSerializer.Create(HKEY_CURRENT_USER, 'software/mental studio/devotee/test'));
注意,其中序列化器是通过引用计数维护的,会自动释放,不需要显示释放。
mdf框架全部源码下载。
只使用配置序列化部分的话,只需要MDComm和MDConfig两个单元文件(二进制和XML序列化需要MSerializ单元)。
在BCB中使用的特别注意事项:
要用一个Delphi单元来定义配置类,因为用到了Delphi的RTTI,虽然用C++来写配置类也可以编译,但是会发生运行时错误。特别关键的是序列化器对象必须在Delphi单元中创建。形如:
Constructor TMainConfig.Create(aIniName : String); begin Inherited Create(TMIniSerializer.Create(aIniName, 'Default')); end; // 然后在BCB中这样使用 TMainConfig * MainCfg = new TMainConfig(ChangeFileExt(Application->ExeName,".ini"));
相关文章推荐
- 使用logback处理程序日志信息-logback的基本配置与使用
- IIS中预览错误问题的解决办法(HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射 )
- 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加MIME映射
- 简单的学生信息处理程序实现(C++程序设计第2周)
- iis报错:404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- 轻松加密ASP.NET 2.0 Web程序配置信息
- 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理解决方案 服务器配置错误
- 轻松加密ASP.NET 2.0 Web程序配置信息
- 配置信息的处理
- 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
- 用java程序读取xml文件中的配置信息
- 一个WinForm程序配置信息的简单模型和维护工具——设计说明
- vc2008: 控制台程序将数据写入MySql(数据库信息从配置文件读取)
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
- IIS配置asp.net网站出现错误:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
- 处理日常事务的 Linux 程序和它们的配置
- Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法
- 【视频】配置信息管理程序的使用方法的视频演示(一):数据库文档(Excel)的格式说明
- 这是程序启动界面,感觉处理的不错,用软件加载信息的时间作为新线程等待时间
- 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。