在2010年之前,XML是最流行的数据交换标准,直至今天,仍然有许多系统使用XML交换数据。NewLife.Core 很早就提供了XML序列化支持,主要用于配置文件。
Nuget包:NewLife.Core
源码地址:https://github.com/NewLifeX/X/tree/master/NewLife.Core/Serialization/Xml
基本用法
NewLife.Serialization.Xml 类主要成员如下:
/// 深度
publicInt32Depth{get;set; }
/// 处理器列表
publicListHandlers{get; }
/// 使用特性
publicBooleanUseAttribute{get;set; }
/// 使用注释
publicBooleanUseComment{get;set; }
/// 当前名称
publicStringCurrentName{get;set; }
// 写入一个对象
BooleanWrite(Objectvalue,Stringname=null,Typetype=null);
// 读取指定类型对象
ObjectRead(Typetype);
TRead();
BooleanTryRead(Typetype,refObjectvalue);
Xml配置文件
Xml至今仍然是很多系统配置文件的优先选择,最主要是因为它支持注释。
先来看一个SysConfig配置类的文件内容:
它的模型类是这样的:
/// 系统设置。提供系统名称、版本等基本设置
[DisplayName("系统设置")]
publicclassSysConfig:XmlConfig
{
#region属性
/// 系统名称
[DisplayName("系统名称")]
[Description("用于标识系统的英文名")]
publicStringName{get;set; }="";
/// 系统版本
[DisplayName("系统版本")]
publicStringVersion{get;set; }="";
/// 显示名称
[DisplayName("显示名称")]
[Description("用户可见的名称")]
publicStringDisplayName{get;set; }="";
/// 公司
[DisplayName("公司")]
publicStringCompany{get;set; }="";
/// 应用实例。单应用多实例部署时用于唯一标识实例节点
[DisplayName("应用实例。单应用多实例部署时用于唯一标识实例节点")]
publicInt32Instance{get;set; }
/// 开发者模式
[DisplayName("开发者模式")]
publicBooleanDevelop{get;set; }=true;
/// 启用
[DisplayName("启用")]
publicBooleanEnable{get;set; }=true;
/// 安装时间
[DisplayName("安装时间")]
publicDateTimeInstallTime{get;set; }=DateTime.Now;
#endregion
#region方法
/// 加载后触发
protectedoverridevoidOnLoaded()
{
if(IsNew)
{
varasmx=SysAssembly;
Name=asmx?.Name??"NewLife.Cube";
Version=asmx?.Version??"0.1";
DisplayName=(asmx?.Title??asmx?.Name)??"魔方平台";
Company=asmx?.Company??"新生命开发团队";
//Address = "新生命开发团队";
if(DisplayName.IsNullOrEmpty())DisplayName="系统设置";
}
// 本地实例,取IPv4地址后两段
if(Instance
{
try
{
varip=NetHelper.MyIP();
varbuf=ip.GetAddressBytes();
Instance=(buf[2]
}
catch
{
// 异常时随机
Instance=Rand.Next(1,1024);
}
}
base.OnLoaded();
}
/// 系统主程序集
publicstaticAssemblyXSysAssembly
{
get
{
try
{
varlist=AssemblyX.GetMyAssemblies();
// 最后编译那一个
list=list.OrderByDescending(e=>e.Compile)
.ThenByDescending(e=>e.Name.EndsWithIgnoreCase("Web"))
.ToList();
returnlist.FirstOrDefault();
}
catch{returnnull; }
}
}
#endregion
}
配置类需要继承 XmlConfig 基类,然后直接通过静态属性Current读写:
// 读取
varset=SysConfig.Current;
varname=set.Name;
// 保存
set.DisplayName="星尘服务";
set.Save();
如果配置文件不存在,会自动创建新文件,并写入默认值;
如果配置文件字段有增减,或者注释内容有改变,下一次读写时自动覆盖;
总结
当今最流行数据交换格式是Json,几乎没有新系统继续使用Xml作为数据交换。
新的配置系统独立实现了Xml读写,也不再需要这里的Xml序列化,作为兼容,只需要把基类从XmlConfig修改为Config即可。