2012-07-12 24 views
52

Ho una classe denominata WebserviceType Ho ottenuto dallo strumento xsd.exe da un file XSD.Convertire un oggetto in una stringa XML

Ora voglio deserializzare un'istanza di un oggetto WebServiceType in una stringa. Come posso fare questo?

L'oggetto MethodCheckType ha come parametro un array WebServiceType.

Il mio primo tentativo è stato come se lo avessi serializzato: con un XmlSerializer e uno StringWriter (durante la serializzazione ho usato un StringReader).

questo è il metodo in cui ho serializzare l'oggetto WebServiceType:

XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType)); 
     MethodCheckType output = null; 
     StringReader reader = null; 

     // catch global exception, logg it and throw it 
     try 
     { 
      reader = new StringReader(path); 
      output = (MethodCheckType)serializer.Deserialize(reader); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      reader.Dispose(); 
     } 

     return output.WebService; 

Edit:

forse avrei potuto dirlo in parole diverse: ho avuto un'istanza di questo oggetto MethodCheckType d'altro canto ho il documento XML da cui ho serializzato questo oggetto. Ora voglio convertire questa istanza in un documento XML sotto forma di stringa. Dopo questo devo dimostrare se entrambe le stringhe (di documenti XML) sono le stesse. Questo devo fare, perché faccio test unitari del primo metodo in cui leggo un documento XML in uno StringReader e lo serializzo in un oggetto MethodCheckType.

+2

Che errore ottieni? E potresti confondere i termini: la serializzazione (nel mondo XML) sta convertendo * da un oggetto in XML *; la deserializzazione è la conversione * da XML in un oggetto *. Vuoi deserializzare un oggetto ** da ** una stringa XML? – carlosfigueira

risposta

116

Ecco i metodi di conversione per entrambi i modi. questo = un'istanza della classe

public string ToXML() 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(this.GetType()); 
     serializer.Serialize(stringwriter, this); 
     return stringwriter.ToString(); 
    } 

public static YourClass LoadFromXMLString(string xmlText) 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(YourClass)); 
     return serializer.Deserialize(stringReader) as YourClass ; 
    } 
+3

Puoi usare 'generics' per rendere il tuo codice più generico :) –

+8

Dovresti usare il metodo' using' o chiamare 'Dispose' per il corretto rilascio delle risorse. –

+2

Perché? Non è presente alcun riferimento non gestito ... –

49

Mi rendo conto che questo è un post molto vecchio, ma dopo aver visto la risposta di LB ho pensato a come avrei potuto migliorare la risposta accettata e renderlo generico per la mia propria applicazione . Ecco quello che mi si avvicinò con:

public static string Serialize<T>(T dataToSerialize) 
{ 
    try 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(stringwriter, dataToSerialize); 
     return stringwriter.ToString(); 
    } 
    catch 
    { 
     throw; 
    } 
} 

public static T Deserialize<T>(string xmlText) 
{ 
    try 
    { 
     var stringReader = new System.IO.StringReader(xmlText); 
     var serializer = new XmlSerializer(typeof(T)); 
     return (T)serializer.Deserialize(stringReader); 
    } 
    catch 
    { 
     throw; 
    } 
} 

Questi metodi possono ora essere inseriti in una classe di supporto statica, che non significa la duplicazione del codice per ogni classe che deve essere serializzato.

+5

Nel metodo "Serializza", utilizzare dataToSerialize.GetType() invece di typeof (T). A prima vista sembra sicuro usare T come tipo, ma se l'oggetto "dataToSerialize" è stato castato su un tipo genitore (cast ChildClass su BaseClass) genererà un errore.E prima di tutto, controlla per nulla. –

+0

Ha funzionato come un fascino :-). Buona e facile soln. – Karan

+0

Qual è lo scopo di catturare solo per ripensare senza fare altro? – crush

14
public static string Serialize(object dataToSerialize) 
    { 
     if(dataToSerialize==null) return null; 

     using (StringWriter stringwriter = new System.IO.StringWriter()) 
     { 
      var serializer = new XmlSerializer(dataToSerialize.GetType()); 
      serializer.Serialize(stringwriter, dataToSerialize); 
      return stringwriter.ToString(); 
     } 
    } 

    public static T Deserialize<T>(string xmlText) 
    { 
     if(String.IsNullOrWhiteSpace(xmlText)) return default(T); 

     using (StringReader stringReader = new System.IO.StringReader(xmlText)) 
     { 
      var serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(stringReader); 
     } 
    } 
+1

La serializzazione richiede generici. L'oggetto è abbastanza se (dataToSerialize == null) restituisce null; ... var serializer = new XmlSerializer (dataToSerialize.GetType()); ... – AlphaOmega

+0

Forse cambiare il codice sorgente per usare 'object'? – Kiquenet

Problemi correlati