Désérialiser de la chaîne à la place TextReader


135

Je veux changer mon code 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 code qui convertirait un XML en chaîne, puis convertirait la chaîne en objet Car.

Est-ce possible?

Réponses:


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

Pour l'utiliser:

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

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

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

1
puis-je supprimer "this" de la chaîne statique publique XmlSerializeToString (cet objet objectInstance) ??
user278618

Vous pouvez supprimer «ceci», mais la méthode n'est plus une méthode d'extension. En faisant de la méthode une méthode d'extension, c'est possible: string s = "blah!"; string xml = s.XmlSerializeToString (); note: assurez-vous de référencer l'espace de noms de la classe statique qui contient les méthodes d'extension dans vos utilisations, sinon les méthodes d'extension ne fonctionneront pas! La seule raison d'utiliser «this» est d'en faire une méthode d'extension, il est tout à fait sûr de le supprimer.
Elmer

Vous manquez le «ceci». dans votre 2ème méthode pour l'afficher comme une extension. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Je vais éditer le message principal.
Omzig

StringReaderest la pièce manquante. Merci.
primo

83

Si vous avez le XML stocké dans une variable de chaîne, vous pouvez utiliser un StringReader :

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

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

15

1-ligne, prend une chaîne XML textet YourTypecomme type d'objet attendu. pas très différent des autres réponses, juste compressé à 1 ligne:

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

4
Je fermerais le StringReader après utilisation.
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

Copié sans vergogne à partir de la désérialisation générique d'une chaîne 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);
        }
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.