2016-04-08 2 views
0

Я пытаюсь десериализовать строку xml для объекта. Но мой obect всегда равен нулю.XML Deserialization не работает с абстрактным классом

У меня есть абстрактный класс (Response), класс, который наследуется от «Response» (DirectorSearchResponse) и объект в классе «DirectorSearchResponse» (HeaderResponse). После десериализации этот объект всегда равен нулю.

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() 
    { 

    } 
} 

Мой бегущий код:

 /* 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); 
     } 

Когда я выполняю свой код, объект «titi» является инстанцированным, но «Заголовок» всегда равен нулю.

Как получить значение «toto» из xml?

ответ

1

XML чувствителен к регистру, поэтому вам нужно использовать [XmlElement("header")] информировать сериалайзер правильного имени элемента для Header собственности:

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

    public Response() 
    { 
    } 
} 

[XmlRoot("header")] вы обратились к HeaderResponse только контролирует свое имя элемента, когда это корневой элемент документа XML.

+0

Работает. Благодарю. – BaptX

0

Вам нужно добавить ссылку на абстрактный класс, как это:

[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 правильно? – BaptX

+0

[Корневой атрибут Xml] (https://msdn.microsoft.com/fr-fr/library/system.xml.serialization.xmlrootattribute%28v=vs.110%29.aspx) – Kypaz

Смежные вопросы