Deserializar elemento XML vacío como Guid.Empty

Tengo algunos problemas con la deserialización.

 ...  ...  

Si yo uso

 00000000-0000-0000-0000-000000000000 

está funcionando normalmente, pero en el caso de que use solo – el objeto no está deserializando (

¿Hay alguna manera de deserializar el elemento vacío como Guid.Empty?

Propiedad que debe ser mapeada con el valor de este elemento:

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

La misma situación en JSON funciona normalmente y usa Guid.Empty en lugar del valor de elemento vacío

 { "CardNumber": "" } 

La excepción que está viendo explica el problema claramente:

 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)." 

Como se indicó, XmlSerializer no admite deserializar una cadena vacía a un Guid . Por lo tanto, tendrá que hacer la conversión manualmente utilizando una propiedad sustituta:

 [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); } } } 

Si esto es algo que necesita hacer en muchos tipos diferentes que tienen Guid? propiedades, puede extraer un tipo sustituto de la siguiente manera:

 [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 }; } } 

Y utilízalo como:

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

Aquí estoy aprovechando el hecho de que la propiedad XmlElementAttribute.Type recoge automáticamente la conversión implícita que XmlElementAttribute.Type para Guid? desde y hacia XmlGuid .

Nulo no es lo mismo que Guid.Empty . En el serializador JSON, denota nulo usando una cadena vacía.

Si serializas tu clase usando XmlSerializer verás que usa xsi:nil="true" para denotar un valor nulo.

Por ejemplo: