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?

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

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.