TextReader yerine dizeden seriyi kaldır


135

Kodumu şundan değiştirmek istiyorum:

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

XML'i bir dizeye dönüştürecek ve daha sonra dizeyi Araba nesnesine dönüştürecek bir koda dönüştürün.

Mümkün mü?

Yanıtlar:


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

Kullanmak için:

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

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

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

1
"this" i genel statik dizeden XmlSerializeToString'den (bu nesne objectInstance) kaldırabilir miyim?
user278618

'Bunu' kaldırabilirsiniz, ancak bu durumda yöntem artık bir genişletme yöntemi değildir. Yöntemi bir uzantı yöntemi yaparak, bu mümkündür: string s = "blah!"; string xml = s.XmlSerializeToString (); not: kullanımlarınızda uzantı yöntemlerini tutan statik sınıfın ad alanına başvurduğunuzdan emin olun, aksi takdirde uzantı yöntemleri çalışmayacaktır! 'Bu' kullanmanın tek nedeni, onu bir uzatma yöntemi yapmaktır, tamamen güvenlidir.
Elmer

"Bunu" kaçırıyorsun. bir uzantı olarak göstermesini sağlamak için 2. yönteminizde. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Ana yazıyı düzenleyeceğim.
Omzig

StringReadereksik parça. Teşekkürler.
primo

83

Bir dize değişkeni içinde depolanan XML'e sahipseniz, bir StringReader kullanabilirsiniz :

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

kullanarak (var reader = new StringReader (xml)) return (Car) new XmlSerializer (typeof (Car)) Deserialize (reader);
Aelphaeis

15

1 satır, bir XML dizesi textve YourTypebeklenen nesne türü olarak alır. diğer cevaplardan çok farklı değil, sadece 1 satıra sıkıştırılmış:

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

4
StringReader'ı kullanımdan sonra kapatırdım.
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;
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.