c# - serialize - Convierta un objeto en una cadena XML
serialize object c# (3)
Tengo una clase llamada WebserviceType
que obtuve de la herramienta xsd.exe de un archivo XSD.
Ahora quiero deserializar una instancia de un objeto WebServiceType
a una cadena. ¿Cómo puedo hacer esto?
El objeto MethodCheckType
tiene como params una matriz WebServiceType
.
Mi primer intento fue como serializarlo: con un XmlSerializer
y un StringWriter
(mientras StringReader
utilicé un StringReader
).
Este es el método en el que serializo el objeto 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;
Editar:
Quizás podría decirlo en otras palabras: tengo una instancia de este objeto MethodCheckType
y, 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
.
Aquí hay un método de conversión para ambos sentidos. esta = instancia de tu 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 ;
}
Me doy cuenta de que esta es una publicación muy antigua, pero después de ver la respuesta de LB, pensé en cómo podía mejorar la respuesta aceptada y hacerla genérica para mi propia aplicación. Esto es lo que se me 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 ahora pueden colocarse en una clase auxiliar estática, lo que significa que no hay duplicación de código en cada clase que necesita ser serializada.
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);
}
}