XmlSerializer和持续时间数据类型序列化

问题描述

我们提取了包含工期数据类型的标准行业格式XML。它表示终生小时年龄值。所有制造商都以XmlSerializer自动将其序列化(以天和小时为单位)的方式提供该值,例如P42DT16H代表1024小时(42 * 24 + 16)。

顺便说一句,XmlSerializer的实现始终将几个月视为30天(IMO是正确的)。使用月份,1024将是P0Y1M12DT16H(1 30 24 + 12 * 24 + 16)。当然,总是将1024序列化为P42DT16H ...这是预期的和首选的。

不幸的是,有一家制造商使用基准日期1970-01-01为数据提供了他们自己对该数据类型的荒谬解释。因此,他们花了1970-01-01,添加了1024小时,然后尝试使用包含月值的持续时间数据类型来表示它。因为一月份有31天,所以出现在P0Y1M 11 DT16H而不是P0Y1M 12 DT16H。因此,在认反序列化之后,我们的处理时间减少了1000 ... 24小时。

请记住,这是一种行业标准的XML格式,因此,我们有一个解析器,可以毫无问题地解析来自许多不同制造商的提要....除了这个异常值。我不敢相信其他食人者没有告诉他们他们的饲料不正确。 (我们一年前就做过,显然他们没有计划进行更改。)

在这种情况下使用认的XmlSerializer时,是否有任何可能的方法可以控制持续时间数据类型的反序列化而无需手动反序列化?在反序列化时,我将知道我要击中哪个提要,以及是否对该数据类型使用自定义序列化。

var serializer = new XmlSerializer(typeof(Fleet));
var fleet = (Fleet)serializer.Deserialize(new StringReader(sourceXml));

一旦我手动分析了持续时间值的每个部分,我就可以像这样获得正确的值:

var baseline = new DateTime(1970,1,1);
var dtTo = dtFrom.AddYears(year).AddMonths(month).AddDays(day).AddHours(hour);
var hours = dtTo.Subtract(baseline).TotalHours;

顺便说一句,class属性的装饰如下:

[XmlElement(DataType = "duration",ElementName = "Hour",Order = 1)]
public string SerializedHours { get; set; }

谢谢大家。作为一项行业标准,即使花时间为开关编写代码也超出了IMO的范围。但是我在这里

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)