2012-07-12 11 views
52

Tengo una clase llamada WebserviceType Obtuve de la herramienta xsd.exe de un archivo XSD.Convierta un objeto a una cadena XML

Ahora quiero deserializar una instancia de un objeto WebServiceType a una cadena. ¿Cómo puedo hacer esto?

El objeto MethodCheckType tiene como parámetros una matriz WebServiceType.

Mi primer intento fue como lo serialé: con un XmlSerializer y un StringWriter (mientras serializaba usé un StringReader).

Este es el método en el que me serializar el WebServiceType objeto:

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; 

Editar:

tal vez podría decirlo con otras palabras: Tengo una instancia de este objeto MethodCheckType Por otro lado, tengo el documento XML desde el que serialicé este objeto. Ahora quiero convertir esta instancia en un documento XML en forma de cadena. Después de esto, tengo que probar si ambas cadenas (de documentos XML) son las mismas. Esto tengo que hacer, porque realizo pruebas unitarias del primer método en el que leo un documento XML en un StringReader y lo serializo en un objeto MethodCheckType.

+2

¿Qué error obtienes? Y puede confundir los términos: la serialización (en el mundo XML) está convirtiendo * de un objeto a XML *; la deserialización está convirtiendo * de XML en un objeto *. ¿Quieres deserializar un objeto ** de ** una cadena XML? – carlosfigueira

Respuesta

116

Aquí están los métodos de conversión para ambos sentidos. este = instancia de la clase

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

Puede usar 'generics' para hacer que su código sea más genérico :) –

+8

Debe usar el patrón' using' o el método 'Dispose' para liberar los recursos correctamente. –

+2

¿Por qué? No se utiliza ninguna referencia no administrada ... –

49

Comprendo que esto es un post muy antiguo, pero después de ver la respuesta de LB pensé en cómo podría mejorar la respuesta aceptada y que sea genérico para mi propia aplicación . Esto es lo que ocurrió:

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; 
    } 
} 

Estos métodos pueden ahora ser colocados en una clase de ayuda estática, lo que significa que no hay duplicación de código a todas las clases que necesita ser serializado.

+5

En el método "Serialize", use dataToSerialize.GetType() en lugar de typeof (T). A primera vista, parece seguro usar T como el tipo, pero si el objeto "dataToSerialize" se ha convertido a un tipo principal (ChildClass echado a BaseClass) arrojará un error.Y compruebe que sea nulo primero, por supuesto. –

+0

Funcionó como un encanto :-). Buena y fácil solución. – Karan

+0

¿Cuál es el punto de atrapar solo para volver a lanzar sin hacer nada más? – 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

Serialize necesita genéricos. El objeto es suficiente if (dataToSerialize == null) return null; ... var serializer = new XmlSerializer (dataToSerialize.GetType()); ... – AlphaOmega

+0

¿Quizás cambiar el código fuente para usar 'object'? – Kiquenet

Cuestiones relacionadas