Xml序列化

Posted 智能大石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xml序列化相关的知识,希望对你有一定的参考价值。

在2010年之前,XML是最流行的数据交换标准,直至今天,仍然有许多系统使用XML交换数据。NewLife.Core 很早就提供了XML序列化支持,主要用于配置文件。

Nuget包:NewLife.Core


基本用法

NewLife.Serialization.Xml 类主要成员如下:

/// <summary>深度</summary>
public Int32 Depth { get; set; }
/// <summary>处理器列表</summary>
public List<IXmlHandler> Handlers { get; }
/// <summary>使用特性</summary>
public Boolean UseAttribute { get; set; }
/// <summary>使用注释</summary>
public Boolean UseComment { get; set; }
/// <summary>当前名称</summary>
public String CurrentName { get; set; }
// 写入一个对象
Boolean Write(Object value, String name = null, Type type = null);
// 读取指定类型对象
Object Read(Type type);
T Read<T>();
Boolean TryRead(Type type, ref Object value);


Xml配置文件

Xml至今仍然是很多系统配置文件的优先选择,最主要是因为它支持注释。

先来看一个SysConfig配置类的文件内容:

<?xml version="1.0" encoding="utf-8"?>
<Sys>
<!--用于标识系统的英文名-->
<Name>StarServer</Name>
<!--系统版本-->
<Version>1.0.7558.41644</Version>
<!--用户可见的名称-->
<DisplayName>星尘分布式服务</DisplayName>
<!--公司-->
<Company>新生命开发团队</Company>
<!--应用实例。单应用多实例部署时用于唯一标识实例节点-->
<Instance>3</Instance>
<!--开发者模式-->
<Develop>true</Develop>
<!--启用-->
<Enable>true</Enable>
<!--安装时间-->
<InstallTime>2020-09-10 23:08:42</InstallTime>
</Sys>

它的模型类是这样的:

/// <summary>系统设置。提供系统名称、版本等基本设置</summary>
[DisplayName("系统设置")]
public class SysConfig : XmlConfig<SysConfig>
{
#region 属性
/// <summary>系统名称</summary>
[DisplayName("系统名称")]
[Description("用于标识系统的英文名")]
public String Name { get; set; } = "";
/// <summary>系统版本</summary>
[DisplayName("系统版本")]
public String Version { get; set; } = "";
/// <summary>显示名称</summary>
[DisplayName("显示名称")]
[Description("用户可见的名称")]
public String DisplayName { get; set; } = "";
/// <summary>公司</summary>
[DisplayName("公司")]
public String Company { get; set; } = "";
/// <summary>应用实例。单应用多实例部署时用于唯一标识实例节点</summary>
[DisplayName("应用实例。单应用多实例部署时用于唯一标识实例节点")]
public Int32 Instance { get; set; }
/// <summary>开发者模式</summary>
[DisplayName("开发者模式")]
public Boolean Develop { get; set; } = true;
/// <summary>启用</summary>
[DisplayName("启用")]
public Boolean Enable { get; set; } = true;
/// <summary>安装时间</summary>
[DisplayName("安装时间")]
public DateTime InstallTime { get; set; } = DateTime.Now;
#endregion
#region 方法
/// <summary>加载后触发</summary>
protected override void OnLoaded()
{
if (IsNew)
{
var asmx = 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 <= 0)
{
try
{
var ip = NetHelper.MyIP();
var buf = ip.GetAddressBytes();
Instance = (buf[2] << 8) | buf[3];
}
catch
{
// 异常时随机
Instance = Rand.Next(1, 1024);
}
}
base.OnLoaded();
}
/// <summary>系统主程序集</summary>
public static AssemblyX SysAssembly
{
get
{
try
{
var list = AssemblyX.GetMyAssemblies();
// 最后编译那一个
list = list.OrderByDescending(e => e.Compile)
.ThenByDescending(e => e.Name.EndsWithIgnoreCase("Web"))
.ToList();
return list.FirstOrDefault();
}
catch { return null; }
}
}
#endregion
}

配置类需要继承 XmlConfig<T> 基类,然后直接通过静态属性Current读写:

// 读取
var set = SysConfig.Current;
var name = set.Name;
// 保存
set.DisplayName = "星尘服务";
set.Save();

如果配置文件不存在,会自动创建新文件,并写入默认值;

如果配置文件字段有增减,或者注释内容有改变,下一次读写时自动覆盖;


总结

当今最流行数据交换格式是Json,几乎没有新系统继续使用Xml作为数据交换。

新的配置系统独立实现了Xml读写,也不再需要这里的Xml序列化,作为兼容,只需要把基类从XmlConfig<T>修改为Config<T>即可。


以上是关于Xml序列化的主要内容,如果未能解决你的问题,请参考以下文章

需要示例代码片段帮助

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

XML 属性未获取命名空间前缀

创建片段而不从 java 代码实例化它

如何组合绑定片段而不将它们包装在 XML 文字中

我们可以在活动 xml 中编写 UI 以及在片段 xm 中编写 UI 吗?