将空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"
来表示空值。
例如: