2012-05-04 10 views
31

पर पढ़ना मैं एक ऑब्जेक्ट को एक्सएमएल स्ट्रिंग में लिखने की कोशिश कर रहा हूं और उस स्ट्रिंग को ले और इसे डीबी में सहेज रहा हूं। लेकिन सबसे पहले मुझे स्ट्रिंग प्राप्त करने की आवश्यकता है ...मेमोरी स्ट्रीम से स्ट्रिंग

private static readonly Encoding LocalEncoding = Encoding.UTF8; 

    public static string SaveToString<T> (T settings) 
    { 
     Stream stream = null; 
     TextWriter writer = null; 
     string settingsString = null; 

     try 
     { 
      stream = new MemoryStream(); 

      var serializer = new XmlSerializer(typeof(T)); 

      writer = new StreamWriter(stream, LocalEncoding); 

      serializer.Serialize(writer, settings); 

      var buffer = new byte[stream.Length]; 

      stream.Read(buffer, 0, (int)stream.Length); 

      settingsString = LocalEncoding.GetString(buffer); 
     } 
     catch(Exception ex) 
     { 
      // If the action cancels we don't want to throw, just return null. 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 

      if(writer != null) 
       writer.Close(); 
     } 

     return settingsString; 
    } 

ऐसा लगता है कि स्ट्रीम बाइट से भर जाती है। लेकिन जब मैं इसे वापस बफर में पढ़ता हूं और फिर स्ट्रिंग में ... बफर '0' से भरा होता है! यकीन नहीं है कि मैं यहाँ क्या गलत कर रहा हूँ दोस्तों।

+1

संभव डुप्लिकेट [कैसे आप एक MemoryStream से एक स्ट्रिंग मिलता है?] (Http://stackoverflow.com/questions/78181/how-do-you-get-a-string-from -ए-मेमोरीस्ट्रीम) – andyp

उत्तर

64

यदि आपने stream.Read के परिणामों की जांच की है, तो आपने देखा होगा कि उसने कुछ भी नहीं पढ़ा है - क्योंकि आपने स्ट्रीम को वापस नहीं किया है। (आप stream.Position = 0; के साथ ऐसा कर सकता है।) हालांकि, यह आसान है बस ToArray कॉल करने के लिए:

settingsString = LocalEncoding.GetString(stream.ToArray()); 

(आप Stream से MemoryStream को stream के प्रकार को बदलना होगा, लेकिन के रूप में यह एक ही विधि में है कि ठीक है जहां आप इसे बनाते हैं।)

वैकल्पिक रूप से - और भी अधिक सरल - StreamWriter के बजाय बस StringWriter का उपयोग करें। यदि आप यूटीएफ -16 के बजाय यूटीएफ -8 का उपयोग करना चाहते हैं, तो आपको एक सबक्लास बनाना होगा, लेकिन यह बहुत आसान है। उदाहरण के लिए this answer देखें।

मैं Exception और को मानते हुए इस तरह से चिंतित हूं कि इसका मतलब कुछ हानिकारक है, वैसे भी - कुछ भी लॉग इन किए बिना। ध्यान दें कि using विवरण स्पष्ट finally ब्लॉक लिखने से आम तौर पर क्लीनर होते हैं।

+0

धन्यवाद :)। यह तेज़ काम है। मुझे पता है कि उपयोग ब्लॉक अधिक सामान्य हैं। लेकिन मुझे वह समानता पसंद है जो मुझे देता है, कोई घोंसला नहीं। जो केवल एक शैली की बात है। मुझे नहीं पता था कि एक स्ट्रिंगवाइटर था, बहुत आसान लगता है, लेकिन मुझे encoing निर्दिष्ट करने की क्षमता पसंद है। मैं शायद एक नई कक्षा के बजाय इसके लिए एक अधिभार जोड़ दूंगा। – tigerswithguitars

+0

@tigerswithguitars: आप 'स्ट्रिंगवाइटर' में एक ओवरलोड जोड़ने का इरादा कैसे रखते हैं? नई कक्षा का मुद्दा यह है कि 'स्ट्रिंगवाइटर' हमेशा 'टेक्स्टवाइटर। एन्कोडिंग' संपत्ति से यूटीएफ -16 लौटाता है; अतिरिक्त वर्ग सिर्फ उस संपत्ति को ओवरराइड करता है। –

+0

क्षमा करें, मेरा शब्द भ्रमित था। मैं एन्कोडिंग निर्दिष्ट करने के लिए अपनी विधि में एक अधिभार जोड़ दूंगा। – tigerswithguitars

8
string result = System.Text.Encoding.UTF8.GetString(fs.ToArray()); 
+1

हालांकि यह कोड नमूना संभवतः प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के लिए कुछ आवश्यक स्पष्टीकरण शामिल करना बेहतर होगा। –

+0

यहां 'स्टेम' क्या है? यदि एक चर, तो आपने इसे कैसे चालू किया? 'एफएस' के लिए वही सवाल। –

+0

उपयोगकर्ता ने गलती से सिस्टम – Prasanth

1
string result = Encoding.UTF8.GetString((stream as MemoryStream).ToArray()); 
की
+0

के बजाय स्टेम का उपयोग किया है, मैं यहां 'as'' के उपयोग पर सवाल उठाउंगा - यह आपको किसी भी चीज़ से सुरक्षित नहीं कर रहा है। सबसे पहले, आप जानते हैं कि स्ट्रीम 'मेमोरीस्ट्रीम' है, वैसे भी, भले ही यह नहीं था, 'गेटस्ट्रिंग' में 'शून्य' पास करने से अपवाद फेंक दिया जाएगा, ताकि आप पहले स्थान पर एक स्पष्ट कलाकार का भी उपयोग कर सकें। –

+1

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस सवाल का जवाब देने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करना और/या कैसे यह दीर्घकालिक मूल्य में सुधार करता है। – ryanyuyu

संबंधित मुद्दे