因此,我的任务是复制包含XML元素和属性的现有XML模式。这包括可能未指定的整数。不幸的是,[XmlAttribute]无法处理Nullable值类型。它们是复杂的类型,因此在序列化时会引发异常。由于无法自定义架构,因此无法将此值转换为元素。因此,我尝试了多种破解方法来克服此问题:
使用字符串(简单,但没有强类型。):
[XmlAttribute("batchId")]
public string BatchId { get; set; }
使用属性掩盖可为空的值:
[XmlIgnore]
public int? BatchId { get; set; }
[XmlAttribute("batchId")]
public string BatchIdString
{
get { return BatchId?.ToString(); }
set { }
}
this链接中提到的版本的调整后的实现:
private const int Sentinel = -345673547;
[XmlAttribute("batchId")]
public int BatchId { get; set; } = Sentinel;
public bool ShouldSerializeBatchId() => BatchId != Sentinel;
事情是,我对任何一个都不满意。我研究了XmlSerializer类,但是它已被锁定,并且如果不复制所有类,就无法扩展它。 (比我上面列出的所有内容都要糟糕!)那么,有没有其他人找到这个问题的理想解决方案?这似乎是一个很常见的问题,令我惊讶的是,MS尚未解决此问题。