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?

user278618
la source

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>(); 
Elmer
la source
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);
}
Darin Dimitrov
la source
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));
guest0815
la source
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;
}
Yaman
la source
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);
        }
    }
Reddy
la source