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?

pengguna278618
sumber

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