Deserialize dari string, bukan TextReader


135

Saya ingin mengubah kode saya dari:

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

ke dalam kode yang akan mengkonversi XML ke string, dan kemudian mengkonversi string ke objek Mobil.

Apakah ini mungkin?

Jawaban:


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

Untuk menggunakannya:

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

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

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

1
dapatkah saya menghapus "ini" dari public static string XmlSerializeToString (objectInstance objek ini) ??
user278618

Anda dapat menghapus 'ini', tetapi metode tersebut bukan lagi metode ekstensi. Dengan menjadikan metode metode ekstensi, ini dimungkinkan: string s = "blah!"; string xml = s.XmlSerializeToString (); Catatan: pastikan untuk merujuk namespace dari kelas statis yang menyimpan metode ekstensi di usings Anda, atau metode ekstensi tidak akan berfungsi! Satu-satunya alasan untuk menggunakan 'ini' adalah untuk membuatnya menjadi metode ekstensi, itu benar-benar aman untuk menghapusnya.
Elmer

Anda melewatkan "ini". dalam metode ke-2 Anda untuk membuatnya ditampilkan sebagai ekstensi. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Saya akan mengedit posting utama.
Omzig

StringReaderadalah bagian yang hilang. Terima kasih.
Primo

83

Jika Anda menyimpan XML di dalam variabel string, Anda bisa menggunakan StringReader :

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

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

15

1-liner, mengambil string XML textdan YourTypesebagai tipe objek yang diharapkan. tidak jauh berbeda dengan jawaban lain, cukup dikompres menjadi 1 baris:

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

4
Saya akan menutup StringReader setelah digunakan.
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

Tanpa malu-malu disalin dari deserialization Generik dari string 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);
        }
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.