TextReader के बजाय स्ट्रिंग से Deserialize


135

मैं अपना कोड यहां से बदलना चाहता हूं:

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 को स्ट्रिंग में परिवर्तित करेगा, और फिर स्ट्रिंग को ऑब्जेक्ट कार में परिवर्तित करेगा।

क्या यह संभव है?

जवाबों:


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

इसके प्रयेाग के लिए:

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

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

4
बेहतर: सार्वजनिक स्थैतिक T XmlDeserializeFromString <T> (string objectData) {रिटर्न (T) XmlDeserializeFromString (objectData, typeof (T)); }
ली ट्रेविले

1
क्या मैं सार्वजनिक स्थैतिक स्ट्रिंग XmlSerializeToString (यह ऑब्जेक्ट ऑब्जेक्ट इंस्टेंस) से "इसे" हटा सकता हूं ??
user278618

आप 'इस' को हटा सकते हैं, लेकिन तब विधि अब कोई विस्तार विधि नहीं है। विधि को विस्तार विधि बनाकर, यह संभव है: स्ट्रिंग s = "ब्लाह!"; string xml = s.XmlSerializeToString (); नोट: स्थैतिक वर्ग के नामस्थान का संदर्भ देना सुनिश्चित करें जो आपके उपयोग में विस्तार विधियों को रखता है, या विस्तार विधियां काम नहीं करेंगी! 'यह' का उपयोग करने का एकमात्र कारण इसे विस्तार विधि बनाना है, इसे हटाने के लिए यह पूरी तरह से सुरक्षित है।
एल्मर

आपको "यह" याद आ रहा है। अपने दूसरे तरीके में इसे एक्स्टेंशन के रूप में दिखाने के लिए प्राप्त करें। public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }मैं मुख्य पोस्ट को संपादित करने जा रहा हूं।
ओमजीग

StringReaderलापता टुकड़ा है। धन्यवाद।
प्राइमो

83

यदि आप एक इस्तेमाल कर सकते हैं आप एक स्ट्रिंग चर के अंदर संग्रहित एक्सएमएल है, तो StringReader :

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

(var Reader = new StringReader (xml)) रिटर्न (कार) नया XmlSerializer (टाइपोफ़ (Car)) का उपयोग करके। Deserialize (Reader);
अनलफिस

15

1-लाइनर, XML स्ट्रिंग textऔर YourTypeअपेक्षित ऑब्जेक्ट प्रकार के रूप में लेता है । अन्य उत्तरों से बहुत अलग नहीं, बस 1 पंक्ति में संकुचित:

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

4
मैं उपयोग के बाद StringReader को बंद कर दूंगा।
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;
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.