मैं बेन ग्रिपका के प्रतिलिपि उत्तर से शुरू करूंगा:
public void Save(string FileName)
{
using (var writer = new System.IO.StreamWriter(FileName))
{
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(writer, this);
writer.Flush();
}
}
मैंने पहले इस कोड का उपयोग किया था। लेकिन वास्तविकता से पता चला कि यह समाधान थोड़ा समस्याग्रस्त है। आमतौर पर अधिकांश प्रोग्रामर सिर्फ सेव पर सेटिंग को सीरियलाइज करते हैं और लोड पर सेटिंग्स को डिसेर्बलाइज करते हैं। यह एक आशावादी परिदृश्य है। एक बार क्रमांकन विफल हो जाने के कारण, किसी कारण से, फ़ाइल आंशिक रूप से लिखी गई है, XML फ़ाइल पूर्ण नहीं है और यह अमान्य है। परिणाम में XML deserialization काम नहीं करता है और आपका एप्लिकेशन प्रारंभ में क्रैश हो सकता है। यदि फ़ाइल बहुत बड़ी नहीं है, तो मेरा सुझाव है कि पहले ऑब्जेक्ट को क्रमबद्ध करें और MemoryStream
फिर फाइल पर स्ट्रीम लिखें। यह मामला विशेष रूप से महत्वपूर्ण है अगर कुछ जटिल कस्टम क्रमांकन है। आप कभी भी सभी मामलों का परीक्षण नहीं कर सकते।
public void Save(string fileName)
{
//first serialize the object to memory stream,
//in case of exception, the original file is not corrupted
using (MemoryStream ms = new MemoryStream())
{
var writer = new System.IO.StreamWriter(ms);
var serializer = new XmlSerializer(this.GetType());
serializer.Serialize(writer, this);
writer.Flush();
//if the serialization succeed, rewrite the file.
File.WriteAllBytes(fileName, ms.ToArray());
}
}
वास्तविक दुनिया के परिदृश्य में deserialization को भ्रष्ट क्रमांकन फ़ाइल के साथ गिना जाना चाहिए, यह कभी-कभी होता है। बेन ग्रिपका द्वारा प्रदान किया गया लोड फ़ंक्शन ठीक है।
public static [ObjectType] Load(string fileName)
{
using (var stream = System.IO.File.OpenRead(fileName))
{
var serializer = new XmlSerializer(typeof([ObjectType]));
return serializer.Deserialize(stream) as [ObjectType];
}
}
और इसे कुछ रिकवरी परिदृश्य द्वारा लपेटा जा सकता है। यह सेटिंग्स फ़ाइलों या अन्य फ़ाइलों के लिए उपयुक्त है जिन्हें समस्याओं के मामले में हटाया जा सकता है।
public static [ObjectType] LoadWithRecovery(string fileName)
{
try
{
return Load(fileName);
}
catch(Excetion)
{
File.Delete(fileName); //delete corrupted settings file
return GetFactorySettings();
}
}