2016-07-28 40 views
5

Deserializing ile bazı sıkıntılarım var. Ben sadece <CardNumber /> kullandığınızda Normal çalıştığı ancak durumda oluyorBoş XML öğesinin Guid.Empty olarak deserialize edilmesi

<CardNumber>00000000-0000-0000-0000-000000000000</CardNumber> 

kullanırsanız

<Order> 
    ... 
    <CardNumber /> 
    ... 
</Order> 

- Nesne deserializing değil (

Guid olarak boş bir öğesi serisini bir yolu var mı. Bu öğenin değeriyle eşlenecek özellik:

01 JSON

Aynı durum normal çalışır ve yerine

{ 
    "CardNumber": "" 
} 
+1

Bu sınıfın bir örneğini XML'ye serileştirmeyi ve sonucu kontrol etmeyi denediniz mi? –

+1

Neyi kastediyorsunuz * nesne serileştirme değil (*. İstisna bir istisna mıdır? Öyleyse, mesajınızı, istisna türünü de içeren istisnanın tüm 'ToString()' çıkışını içerecek şekilde düzenleyebilir misiniz? Herhangi bir iç istisna? – dbc

cevap

1

Gördüğünüz istisna açıkça sorunu açıklıyor: belirtildiği gibi

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 bir Guid için boş bir dize deserializing desteklemez. Böylece el ile vekil özelliğini kullanarak dönüşüm yapmak gerekir: bu Guid? özelliklere sahip birçok farklı türde yapmanız gereken bir şey varsa

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

, bunu böyle bir vekil türü çıkarabilir:

İşte

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

otomatik olarak aslında o XmlElementAttribute.Type mülkiyet yararlanarak ediyorum:

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

Ve gibi kullanmak Guid? için tanımlanmış implicit conversion'u XmlGuid'dan alır.

+0

Detaylı açıklama için teşekkürler! – ashpakov

3

Boş Guid.Empty aynı değildir boş eleman değerinin Guid.Empty kullanın. JSON seri hale getiricide boş bir dize kullanarak null'ı belirtirsiniz.

Sınıfınızı XmlSerializer kullanarak seri hale getiriyorsanız, boş değer belirtmek için xsi:nil="true" kullanır. Örneğin

:

<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CardNumber xsi:nil="true" /> 
</Order> 
+0

Çok teşekkür ederim! – ashpakov

İlgili konular