将空XML元素反序列化为Guid.Empty

我有一些反序列化的麻烦。

 ...  ...  

如果我使用

 00000000-0000-0000-0000-000000000000 

它正常工作,但是如果我只使用 – 对象没有反序列化(

有没有办法将空元素反序列化为Guid.Empty?

应该使用此元素的值映射的属性:

 [XmlElement(ElementName = "CardNumber")] [JsonProperty("CardNumber")] public Guid? CardNumber { get; set; } 

JSON中的相同情况正常工作并使用Guid.Empty而不是空元素值

 { "CardNumber": "" } 

您看到的例外情况清楚地解释了问题:

 System.InvalidOperationException occurred Message="There is an error in XML document (3, 3)." InnerException: System.FormatException Message="Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)." 

如上所述, XmlSerializer不支持将空字符串反序列化为Guid 。 因此,您需要使用代理属性手动进行转换:

 [XmlRoot("Order")] public class Order { [XmlIgnore] [JsonProperty("CardNumber")] public Guid? CardNumber { get; set; } [XmlElement(ElementName = "CardNumber", IsNullable = true)] [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonIgnore] public string XmlCardNumber { get { if (CardNumber == null) return null; else if (CardNumber.Value == Guid.Empty) return ""; return XmlConvert.ToString(CardNumber.Value); } set { if (value == null) CardNumber = null; else if (string.IsNullOrEmpty(value)) CardNumber = Guid.Empty; else CardNumber = XmlConvert.ToGuid(value); } } } 

如果您需要在许多具有Guid?不同类型中执行此操作Guid? 属性,你可以提取代理类型,如下所示:

 [XmlType(AnonymousType = true, IncludeInSchema = false)] public class XmlGuid { [XmlIgnore] public Guid Guid { get; set; } [XmlText] public string XmlCardNumber { get { if (Guid == Guid.Empty) return null; return XmlConvert.ToString(Guid); } set { if (string.IsNullOrEmpty(value)) Guid = Guid.Empty; else Guid = XmlConvert.ToGuid(value); } } public static implicit operator Guid?(XmlGuid x) { if (x == null) return null; return x.Guid; } public static implicit operator XmlGuid(Guid? g) { if (g == null) return null; return new XmlGuid { Guid = g.Value }; } public static implicit operator Guid(XmlGuid x) { if (x == null) return Guid.Empty; return x.Guid; } public static implicit operator XmlGuid(Guid g) { return new XmlGuid { Guid = g }; } } 

并使用它像:

 [XmlRoot("Order")] public class Order { [XmlElement(Type = typeof(XmlGuid), ElementName = "CardNumber", IsNullable = true)] [JsonProperty("CardNumber")] public Guid? CardNumber { get; set; } } 

在这里,我利用了XmlElementAttribute.Type属性自动获取我为Guid?定义的隐式转换这一事实Guid? 来自和到XmlGuid

Null与Guid.Empty 。 在JSON序列化程序中,您使用空字符串表示null。

如果使用XmlSerializer序列化类,您将看到它使用xsi:nil="true"来表示空值。

例如: