Deserialisieren Sie stattdessen aus einer Zeichenfolge TextReader

135

Ich möchte meinen Code ändern von:

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();

in Code, der ein XML in eine Zeichenfolge konvertiert und dann eine Zeichenfolge in das Objekt Car konvertiert.

Ist das möglich?

user278618
quelle

Antworten:

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

Um es zu benutzen:

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

//Make Object
var settings = xmlString.XmlDeserializeFromString<ObjectCustomerSettings>(); 
Elmer
quelle
4
Besser: public static T XmlDeserializeFromString <T> (Zeichenfolge objectData) {return (T) XmlDeserializeFromString (objectData, typeof (T)); }
Lee Treveil
1
Kann ich "this" aus der öffentlichen statischen Zeichenfolge XmlSerializeToString (dieses Objekt objectInstance) entfernen?
user278618
Sie könnten 'this' entfernen, aber dann ist die Methode keine Erweiterungsmethode mehr. Wenn Sie die Methode zu einer Erweiterungsmethode machen, ist dies möglich: string s = "blah!"; Zeichenfolge xml = s.XmlSerializeToString (); Hinweis: Verweisen Sie unbedingt auf den Namespace der statischen Klasse, die die Erweiterungsmethoden in Ihren Verwendungen enthält. Andernfalls funktionieren die Erweiterungsmethoden nicht! Der einzige Grund für die Verwendung von 'this' besteht darin, es zu einer Erweiterungsmethode zu machen. Es ist absolut sicher, es zu entfernen.
Elmer
Ihnen fehlt das "dies". in Ihrer 2. Methode, um es als Erweiterung anzuzeigen. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Ich werde den Hauptbeitrag bearbeiten.
Omzig
StringReaderist das fehlende Stück. Vielen Dank.
Primo
83

Wenn Sie das XML in einer Zeichenfolgenvariablen gespeichert haben, können Sie einen StringReader verwenden :

var xml = @"<car/>";
var serializer = new XmlSerializer(typeof(Car));
using (var reader = new StringReader(xml))
{
    var car = (Car)serializer.Deserialize(reader);
}
Darin Dimitrov
quelle
using (var reader = neuer StringReader (xml)) return (Car) neuer XmlSerializer (typeof (Car)). Deserialize (reader);
Aelphaeis
15

1-Liner, nimmt eine XML-Zeichenfolge textund YourTypeals erwarteten Objekttyp. nicht sehr verschieden von anderen Antworten, nur auf 1 Zeile komprimiert:

var result =  (YourType)new XmlSerializer(typeof(YourType)).Deserialize(new StringReader(text));
guest0815
quelle
4
Ich würde den StringReader nach der Verwendung schließen.
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
quelle
6

Schamlos aus der generischen Deserialisierung einer XML-Zeichenfolge kopiert

    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
quelle