C# 10中如何用XmlSerializer反序列化特定格式的DateOnly/DateTime?
解决特定格式DateOnly/DateTime的XML反序列化问题
当XML接口返回dd.MM.yyyy格式的日期(比如<ShipDate>31.10.2022</ShipDate>)时,默认XmlSerializer无法识别该格式,会返回默认日期值(1/1/0001)。以下是针对DateTime和DateOnly类型的具体解决方法:
一、处理DateTime类型
最直接的方案是使用代理属性,通过字符串属性中转XML值并完成格式转换:
using System.Globalization; using System.Xml.Serialization; public class Order { // 标记为不参与XML序列化,仅作为业务使用的属性 [XmlIgnore] public DateTime ShipDate { get; set; } // 对应XML中的<ShipDate>节点,负责接收和转换日期字符串 [XmlElement("ShipDate")] public string ShipDateString { get => ShipDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); set { // 严格按照指定格式解析,避免地区文化影响 if (DateTime.TryParseExact(value, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) { ShipDate = date; } else { // 可根据需求添加格式错误的处理逻辑,比如抛出异常或设置默认值 throw new FormatException($"日期格式错误:{value},需符合dd.MM.yyyy格式"); } } } }
二、处理DateOnly类型(.NET 6+)
DateOnly是.NET 6新增的类型,默认XmlSerializer不支持其序列化/反序列化,同样可以用代理属性解决:
using System.Globalization; using System.Xml.Serialization; public class Order { [XmlIgnore] public DateOnly ShipDate { get; set; } [XmlElement("ShipDate")] public string ShipDateString { get => ShipDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture); set { if (DateOnly.TryParseExact(value, "dd.MM.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) { ShipDate = date; } else { throw new FormatException($"日期格式错误:{value},需符合dd.MM.yyyy格式"); } } } }
注意事项
- 必须指定
CultureInfo.InvariantCulture,避免不同地区的日期格式解析规则干扰(比如部分地区用MM/dd/yyyy)。 - 若需要全局统一处理该格式的日期,可以自定义实现
IXmlSerializable接口的包装类,但代理属性的方式更轻量,适合大多数场景。
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

