আমি বেন গ্রিপকার অনুলিপি দিয়ে শুরু করব:
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();
}
}
আমি এই কোডটি আগে ব্যবহার করেছি। কিন্তু বাস্তবতা দেখায় যে এই সমাধানটি কিছুটা সমস্যাযুক্ত। সাধারণত বেশিরভাগ প্রোগ্রামার সেভ করে সেটিং সেট করে সিরিয়ালাইজ করে এবং লোডে সেটিংসকে ডিসরিয়ালাইজ করে। এটি একটি আশাবাদী দৃশ্য। সিরিয়ালাইজেশন ব্যর্থ হয়ে গেলে কোনও কারণে, ফাইলটি আংশিকভাবে লিখিত হয়, এক্সএমএল ফাইলটি সম্পূর্ণ হয় না এবং এটি অবৈধ। ফলস্বরূপ এক্সএমএল 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();
}
}