Deserializar de cadena en lugar de TextReader


135

Quiero cambiar mi código de:

string path = @"c:\Directory\test.xml";
XmlSerializer s = new XmlSerializer(typeof(Car));

TextReader r = new StreamReader(path);

Car car = (Car)s.Deserialize(r);
r.Close();

en código que convertiría un XML en una cadena, y luego convertiría la cadena al objeto Car.

es posible?

Respuestas:


259
public static string XmlSerializeToString(this object objectInstance)
{
    var serializer = new XmlSerializer(objectInstance.GetType());
    var sb = new StringBuilder();

    using (TextWriter writer = new StringWriter(sb))
    {
        serializer.Serialize(writer, objectInstance);
    }

    return sb.ToString();
}

public static T XmlDeserializeFromString<T>(this string objectData)
{
    return (T)XmlDeserializeFromString(objectData, typeof(T));
}

public static object XmlDeserializeFromString(this string objectData, Type type)
{
    var serializer = new XmlSerializer(type);
    object result;

    using (TextReader reader = new StringReader(objectData))
    {
        result = serializer.Deserialize(reader);
    }

    return result;
}

Para usarlo:

//Make XML
var settings = new ObjectCustomerSettings();
var xmlString = settings.XmlSerializeToString();

//Make Object
var settings = xmlString.XmlDeserializeFromString<ObjectCustomerSettings>(); 

44
Mejor: public static T XmlDeserializeFromString <T> (string objectData) {return (T) XmlDeserializeFromString (objectData, typeof (T)); }
Lee Treveil

1
¿Puedo eliminar "esto" de la cadena estática pública XmlSerializeToString (este objeto objectInstance)?
usuario278618

Puede eliminar 'esto', pero el método ya no es un método de extensión. Al hacer que el método sea un método de extensión, esto es posible: string s = "blah!"; cadena xml = s.XmlSerializeToString (); nota: asegúrese de hacer referencia al espacio de nombres de la clase estática que contiene los métodos de extensión en sus usos, ¡o los métodos de extensión no funcionarán! La única razón para usar 'this' es convertirlo en un método de extensión, es completamente seguro eliminarlo.
Elmer

Te estás perdiendo el "esto". en su segundo método para que se muestre como una extensión. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Voy a editar la publicación principal.
Omzig

StringReaderEs la pieza que falta. Gracias.
primo

83

Si tiene el XML almacenado dentro de una variable de cadena, podría usar un StringReader :

var xml = @"<car/>";
var serializer = new XmlSerializer(typeof(Car));
using (var reader = new StringReader(xml))
{
    var car = (Car)serializer.Deserialize(reader);
}

utilizando (var reader = new StringReader (xml)) return (Car) new XmlSerializer (typeof (Car)). Deserialize (reader);
Aelphaeis

15

1-liner, toma una cadena XML texty YourTypecomo el tipo de objeto esperado. no muy diferente de otras respuestas, solo comprimido a 1 línea:

var result =  (YourType)new XmlSerializer(typeof(YourType)).Deserialize(new StringReader(text));

44
Cerraría el StringReader después del uso.
cederlof

8
static T DeserializeXml<T>(string sourceXML) where T : class
{
    var serializer = new XmlSerializer(typeof(T));
    T result = null;

    using (TextReader reader = new StringReader(sourceXML))
    {
        result = (T) serializer.Deserialize(reader);
    }

    return result;
}

6

Copiado descaradamente de la deserialización genérica de una cadena xml

    public static T DeserializeFromXmlString<T>(string xmlString)
    {
        var serializer = new XmlSerializer(typeof(T));
        using (TextReader reader = new StringReader(xmlString))
        {
            return (T) serializer.Deserialize(reader);
        }
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.