Tengo el siguiente método para guardar un objeto en un archivo:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
Confieso que no lo escribí (solo lo convertí a un método de extensión que tomó un parámetro de tipo).
Ahora necesito que me devuelva el xml como una cadena (en lugar de guardarlo en un archivo). Lo estoy investigando, pero aún no lo he descubierto.
Pensé que esto podría ser realmente fácil para alguien familiarizado con estos objetos. Si no, lo resolveré eventualmente.
fuente
typeof(T)
versustoSerialize.GetType()
, hágalo, pero no en mi respuesta. Gracias.Sé que esto no es realmente una respuesta a la pregunta, pero según el número de votos para la pregunta y la respuesta aceptada, sospecho que las personas realmente están usando el código para serializar un objeto en una cadena.
El uso de la serialización XML agrega basura de texto adicional innecesaria a la salida.
Para la siguiente clase
genera
La mejor solución es usar la serialización JSON (una de las mejores es Json.NET ). Para serializar un objeto:
Para deserializar un objeto:
La cadena JSON serializada se vería así:
fuente
Serializar y deserializar (XML / JSON):
fuente
Nota de seguridad del código
Con respecto a la respuesta aceptada , es importante usarla en
toSerialize.GetType()
lugar detypeof(T)
en elXmlSerializer
constructor: si usa la primera, el código cubre todos los escenarios posibles, mientras que usar la última falla a veces.Aquí hay un enlace con algún código de ejemplo que motiva esta declaración, con
XmlSerializer
una excepción cuandotypeof(T)
se usa, porque pasa una instancia de un tipo derivado a un método que llamaSerializeObject<T>()
que se define en la clase base del tipo derivado: http: // ideone .com / 1Z5J1 . Tenga en cuenta que Ideone usa Mono para ejecutar código: la excepción real que obtendría con el tiempo de ejecución de Microsoft .NET tiene un mensaje diferente al que se muestra en Ideone, pero falla de todos modos.En aras de la exhaustividad, publico el ejemplo de código completo aquí para referencia futura, en caso de que Ideone (donde publiqué el código) no esté disponible en el futuro:
fuente
using (StringWriter textWriter = new StringWriter() {}
para cerrar / desechar el objeto correctamente.using
declaración es el mejor amigo tanto para nosotros como para nuestros queridosIDisposable
objetos de implementación;)Mi 2p ...
fuente
fuente
No pude usar el método JSONConvert sugerido por xhafan
En .Net 4.5, incluso después de agregar la referencia de ensamblaje "System.Web.Extensions", aún no podía acceder a JSONConvert.
Sin embargo, una vez que agregue la referencia, puede imprimir la misma cadena usando:
fuente
Sentí que necesitaba compartir este código manipulado con la respuesta aceptada, ya que no tengo reputación, no puedo comentar ...
fuente
En algunos casos raros, es posible que desee implementar su propia serialización de cadenas.
Pero eso probablemente sea una mala idea a menos que sepa lo que está haciendo. (p. ej., serialización para E / S con un archivo por lotes)
Algo así haría el truco (y sería fácil de editar a mano / lote), pero tenga cuidado de que se realicen algunas verificaciones más, ya que ese nombre no contiene una nueva línea.
fuente
[VB]
[C#]
fuente