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?

usuario278618
fuente

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>(); 
Elmer
fuente
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);
}
Darin Dimitrov
fuente
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));
invitado0815
fuente
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;
}
Yaman
fuente
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);
        }
    }
Reddy
fuente