Buongiorno,
come da oggetto sto cercando di deserializzare un oggetto in XML utilizzando il DataContractSerializer.La classe che deve essere serializzata / deserializzata è la seguente:
public class TestClass {
public TestClass() { }
public int Id { get; set; }
public string UserName { get; set; }
public string Name { get; set; }
public string Target { get; set; }
}
Mentre il codice che si occupa della deserializzazione è il seguente
public static object DeserializeXml(string xml, Type desiredType) {
StringReader sr = new StringReader(xml);
XmlTextReader xtr = new XmlTextReader(sr);
DataContractSerializer dcs = new DataContractSerializer(desiredType, null, int.MaxValue, true, true, null);
return dcs.ReadObject(xtr);
Il problema è che passandogli una stringa XML - in modo hardcoded per fare dei test - l'oggetto che viene deserializzato non ha valorizzata la proprietà Target.La stringa XML che uso per i test è la seguente
< TestClass xmlns="http://schemas.datacontract.org/2004/07/Project001.Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Id>999</Id>
<Name>TODO</Name>
<UserName>TODO</UserName>
<Target>this is the target</Target>
</TestClass>
Premetto che ho provato a decorare la classe con gli attributi DataContract e DataMember ma senza risultati.
Grazie a chi mi vorrà dare una dritta :)
Allora ho creato una piccola Application Console. Oltre ad avere aggiunto i necessari attributi, ho dovuto anche modificare la posizione di "Target" nel file xml. Verifica che il tutto ti funzioni e fammi sapere.
DataContractSerializerExample.zip
Capisc e dotnet tu? No! E allor che parl a fà!
Finalmente!!!
Il tuo esempio funziona benissimo, ma non solo... grazie alla tua dritta - mi riferisco al fatto che hai dovuto spostare l'elemento target nel file XML - adesso anche il mio software funziona.
Sembrerebbe che l'XML debba rispettare la regola per cui l'ordine degli elementi deve essere alfabetico.
e infatti dopo una googlata ho trovato questo...
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/006216ed-75b3-4400-ba96-9cba802d3994
o si rispetta l'ordine alfabetico o si imposta l'ordine degli elementi tramite l'attributo DataMember:
[DataMember(Order = 1)]
grazie
Devi innanzitutto corredare la classe e i membri con gli appositi attributi (DataContractAttribute e DataMemberAttribute). Bisogna poi gestire meglio l'evento che deserializza i dati. Ti mando un semplice esempio presente sul sito MSDN:
Classe DataContractSerializer Dimmi se risolve il problema.
Grazie Antonio,
come già detto anche decorando la classe con gli attributi DataContract e DataMember la situazione non cambia.
Ho dato un'occhiata al link che hai postato ma non mi è utile a risolvere il problema .
Ho visto - sempre nel link - che concettualmente la deserializzazione è gestita in modo simile alla funzione che ho postato io.
Il problema è che l'oggetto deserializzato viene valorizzato correttamente in tutte le proprietà tranne una: Target
Non capisco!!
Si infatti, è una regola della classe DataContractSerializer. Nella deserializzazione bisogna recuperare in ordine alfabetico gli elementi. Il workaround è illustrato nel link che hai postato, e cioè aggiunger l'attributo Order nel DataMember. Ricordati inoltre di segnare la risposta se è corretta, per aiutare gli altri utenti a trovare subito la soluzione al problema.
Associazione Culturale DotNetCampania - C.F.: 95127870632