2013-02-25 4 views
0

У меня возникла проблема десериализации объекта XML. Необработанный XML показывает значение nonexpiredcredits, равное 5, но объект десериализуется со значением 0. Наиболее существенно, исключение не попадает, процесс десериализации просто пропускает элемент. Любая помощь будет оценена по достоинству.Значение игнорируется при десериализации объекта XML

Необработанные XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<theObject> 
    <mobilecredits> 
     <nonexpirecredits>5</nonexpirecredits> 
    </mobilecredits> 
</theObject> 

Объект:

[Serializable()] 
[XmlRoot("theObject")] 
public class mobilecreditsWrapper 
{ 
    [XmlElement("mobilecredits")] 
    public mobilecredits credits { get; set; } 
} 
[Serializable()] 
public class mobilecredits 
{ 
    [XmlElement("nonexpiredcredits")] 
    public int nonexpiredcredits { get; set; } 
} 

десериализации сниппет:

XmlSerializer s = new XmlSerializer(typeof(T)); 
    //T is set to mobilecreditsWrapper in the generic function this code snippet is found in 
var sr = new StringReader(res); 
try 
{ 
    obj = (T)s.Deserialize(sr); 
} 
catch (Exception ex) 
{ 
    //this is not hit 
} 
+0

sidenote: если 'res' является' потоком', вы можете просто передать его в 'XmlSerializer' (нет необходимости вставлять его в' StringReader'). – Default

+0

Это полезно для получения необработанного XML. –

+1

Я не получаю нисходящий знак? У меня была четко определенная проблема, я попросил конкретную помощь. Давайте не будем переводить Stack Overflow в стереотипный форум Linux, где просить о помощи сродни признанию проказы. –

ответ

4

Название тега не совпадает. В вашем XML у вас есть nonexpirecredits, а в вашем классе у вас есть nonexpiredcredits.

1

Почему вы десериализации этот простой xml..You можно использовать LINQ2XML вместо этого.

XDocument doc=XDocument.Load(yourXML); 
int no=(int)doc.Descendants().Element("nonexpirecredits"); 
+0

IntelliSense, сильно напечатанные объекты и т. Д. –

+0

@JuannStrauss уверен ... но этот xml слишком мал для этой цели и излишне. – Anirudha

+0

Код является частью обертки API, которую мы хотим перепродать. наличие сильно типизированных объектов облегчит жизнь разработчикам и сократит время на поддержку. XML - относительно редкий навык, поэтому я скрываю его под слоем абстракции. Это также означает, что я могу изменить datalayer в EF, NHibernate и т. Д., Не переписывая несколько методов. –

1

У вас есть опечатка - ваш атрибут xml указывает nonexpiredcredits, но ваш xml не имеет d - вы называете его nonexpirecredits.

+0

Oi Vey! Благодарю. –