DotNetCampania
Il primo portale campano dedicato allo sviluppo software con tecnologie Microsoft

Problemi nella deserializzazione con DataContractSerializer

rated by 0 users
Risposto This post has 2 verified answers | 5 Replies | 2 Followers

Top 25 Partecipanti
15 Post
Punteggio 315
manu71 posted on 8 set 2009 10:58

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 :)

 

Risposto Verified Answer

Top 10 Partecipanti
Maschio
288 Post
Punteggio 3.802

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à!

Top 25 Partecipanti
15 Post
Punteggio 315

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

  • | Punteggio Post: 40

All Replies

Top 10 Partecipanti
Maschio
288 Post
Punteggio 3.802

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:

Dimmi se risolve il problema.

Capisc e dotnet tu? No! E allor che parl a fà!

  • | Punteggio Post: 20
Top 25 Partecipanti
15 Post
Punteggio 315

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 Sad.

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!!

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
288 Post
Punteggio 3.802

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à!

Top 25 Partecipanti
15 Post
Punteggio 315

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

  • | Punteggio Post: 40
Top 10 Partecipanti
Maschio
288 Post
Punteggio 3.802

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.

Capisc e dotnet tu? No! E allor che parl a fà!

  • | Punteggio Post: 5
Pagina 1 di 1 (6 elementi) | RSS

Associazione Culturale DotNetCampania - C.F.: 95127870632

Powered by Community Server (Commercial Edition), by Telligent Systems