2009-05-17 23 views
6
 using (var file_stream = File.Create("users.xml")) 
     { 
      var serializer = new XmlSerializer(typeof(PasswordManager)); 
      serializer.Serialize(file_stream, this); 
      file_stream.Close(); 
     } 

उपर्युक्त कोड का उपयोग पूरी तरह से काम करता है।एक्सएमएल सीरियलाइजेशन

  var serializer = new XmlSerializer(typeof(PasswordManager)); 
      serializer.Serialize(File.Create("users.xml"), this); 

मैं निम्न अपवाद प्राप्त जब मैं एक ही परीक्षण में users.xml फ़ाइल deserialize करने की कोशिश: हालांकि, जब मैं इसे करने के लिए छोटा प्रक्रिया फ़ाइल 'users.xml' उपयोग नहीं कर सकते क्योंकि यह है एक और प्रक्रिया द्वारा इस्तेमाल किया जा रहा है।

ऐसा लगता है कि फ़ाइल। क्रेट विधि एक खोला गया फ़ाइलस्ट्रीम लौटाता है, क्योंकि मैं इसे बंद नहीं कर सकता क्योंकि मैं इसके संदर्भ में नहीं हूं।

मेरा बुरा, या माइक्रोसॉफ्ट? ;-)

+0

वहाँ एक बुनियादी विचार की यहाँ है कि आप भूल रहे हैं (जो करना आसान है) है - वस्तुओं कि IDisposable इंटरफ़ेस का उपयोग का उपयोग कर के बारे में पढ़ें जाने। – overslacked

उत्तर

11

समस्या यह है कि आपके दूसरे उदाहरण में आप एक फ़ाइल हैंडल खोलते हैं जिसे आपने कभी निपटान नहीं किया है, इसलिए दूसरी बार जब आप अपनी विधि को कॉल करेंगे तो यह आपके द्वारा वर्णित अपवाद को फेंक देगा। पहला स्निपेट बेहतर तरीका है (आप file_stream को हटा सकते हैं। बंद करें() बिट - इसे स्वचालित रूप से स्ट्रीम द्वारा बुलाया जाएगा। डिस्प्ले())।

+0

धन्यवाद, मेरा बुरा यह तब है। – Dabblernl

0

यदि आपके पास "उपयोग" कथन नहीं था, लेकिन करीब बनाए रखा, तो आप ठीक रहे होंगे।

[संपादित करें: जोड़ा कोशिश ... अंत में, धन्यवाद cheeso]

var serializer = new XmlSerializer(typeof(PasswordManager)); 
FileStream fs; 
try 
{ 
    fs = File.Create("users.xml"); 
    serializer.Serialize(fs, this); 
} 
finally 
{ 
    fs.Close(); // or fs.Dispose() 
} 

उस मामले में, हालांकि, निपटान बेहतर है क्योंकि यह सभी कार्यों यह साफ करने के लिए रखना चाहिए जानता है, करीब (और किसी और चीज) सहित।

+0

कोशिश मत भूलना ... अंत में! – Cheeso

+0

वाह कि वाक्यविन्यास का उपयोग सुविधाजनक है ... धन्यवाद Cheeso –

2

आपको में क्रमशः ब्लॉक का प्रयास करना चाहिए ताकि आप सुनिश्चित कर सकें कि फ़ाइल सफलता या विफलता के बावजूद बंद/डिस्पोजेड है। कीवर्ड का उपयोग करने के लिए यह आपके लिए है।

var serializer = new XmlSerializer(typeof(PasswordManager)); 
var fs = File.Create("users.xml"); 
try { serializer.Serialize(fs,this); } 
finally { fs.Close(); } 
0

फ़ाइल। क्रेट को मेरे पिछले उत्तर में दिखाए गए प्रयास ब्लॉक के बाहर रखा जाना चाहिए। यदि आप इसे ब्लॉक ब्लॉक के अंदर डालते हैं, तो आपको बंद करने से पहले एक शून्य संदर्भ के लिए fs जांचना होगा। निम्नलिखित सही कोड दिखाता है लेकिन मेरा पहला जवाब बहुत बेहतर है क्योंकि आप इस चेक से बच सकते हैं।

serializer = new XmlSerializer(typeof(PasswordManager)); 
FileStream fs; 
try 
{ 
    fs = File.Create("users.xml"); 
    serializer.Serialize(fs, this); 
} 
finally 
{ 
    if (fs != null) // in case File.Create fails 
     fs.Close(); // or fs.Dispose() 
} 
संबंधित मुद्दे