2016-04-08 29 views
0

ile çalışmıyor Xml dizesinden bir nesneye seri hale getirilmeye çalışıyorum. Ama benim cezam her zaman boş.XML Deserialization, soyut sınıf

"Response" (DirectorSearchResponse) öğesinden devralınan bir sınıf ve "DirectorSearchResponse" sınıfındaki bir nesne (HeaderResponse) olan bir soyut sınıfa (Response) sahibim. Bu nesne serileştirme işleminden sonra her zaman sıfırdır.

Response.cs

public abstract class Response 
{ 
    public HeaderResponse Header { get; set; } 

    public Response() 
    { 
    } 
} 

DirectorSearchResponse.cs

[XmlRoot("xmlresponse")] 
public class DirectorSearchResponse : Response 
{ 
    public DirectorSearchResponse() : base() 
    { 
     /* DO NOTHING */ 
    } 
} 

HeaderResponse.cs

[XmlRoot("header")] 
public class HeaderResponse 
{ 
    [XmlElement("toto")] 
    public String toto { get; set; } 

    public HeaderResponse() 
    { 

    } 
} 

Benim çalışan kodu:

 /* DESERIALIZE */ 
     String toto = "<xmlresponse><header><toto>tutu</toto><reportinformation><time>08/04/2016 13:33:37</time><reporttype> Error</reporttype><country>FR</country><version>1.0</version><provider>www.creditsafe.fr</provider><chargereference></chargereference></reportinformation></header><body><errors><errordetail><code>110</code><desc></desc></errordetail></errors></body></xmlresponse>"; 
     XmlSerializer xsOut = new XmlSerializer(typeof(DirectorSearchResponse)); 
     using (TextReader srr = new StringReader(toto)) 
     { 
      DirectorSearchResponse titi = (DirectorSearchResponse)xsOut.Deserialize(srr); 
     } 

Kodumu çalıştırdığımda, "titi" nesnesinin anlamı yoktur, ancak "Üstbilgi" her zaman boştur.

"toto" değeri xml'den nasıl alınır?

cevap

1

XML harfe duyarlıdır, bu nedenle Header özellik için doğru eleman adının seri hale bilgilendirmek için [XmlElement("header")] kullanmak gerekir:

public abstract class Response 
{ 
    [XmlElement("header")] 
    public HeaderResponse Header { get; set; } 

    public Response() 
    { 
    } 
} 

[XmlRoot("header")] bunu bir XML belgesinin kök öğesi olduğunda yalnızca öğe adı kontrolleri HeaderResponse başvuruda bulundu.

+0

Çalışıyor. Teşekkürler. – BaptX

0

Böyle soyut sınıfa bağlantı eklemek gerekir:

[XmlRoot(ElementName = "Response")] 
public abstract class Response 
{ 
    public HeaderResponse Header { get; set; } 

    public Response() 
    { 
    } 
} 

[XmlRoot(ElementName = "Response")] 
public class DirectorSearchResponse : Response 
{ 
    public DirectorSearchResponse() : base() 
    { 
    /* DO NOTHING */ 
    } 
} 
+0

XmlRoot, xml'nin sağ kök düğümünü saptamak mıdır? – BaptX

+0

[Xml kök özniteliği] (https://msdn.microsoft.com/fr-fr/library/system.xml.serialization.xmlrootattribute%28v=vs.110%29.aspx) – Kypaz