מה שעשיתי בסופו של דבר:
כתבתי מחלקה של סריליזציה ודסריליזציה,
אני נותן למשתמש לבחור את התיקייה הרצויה עליו (או ליצור חדשה) ובה נשמרים הנתונים.
בתיקייה שהוא בחר אני יוצר (מאחורי הקלעים) עוד 2 תיקיות משנה: userdata ו data כמו שרחמים המליץ.
בתוך התיקייה דטה אני שומר כל ליסט בתור קובץ נפרד.
בפתיחה של הקבצים, הוא בוחר את התיקייה הראשית שהוא יצר, ואני לבד פותח את הקבצים מתוך תיקיות המשנה.
כתבתי את הקוד הבא: (אזהרה - קצת ארוך :lol: )
public static class SerilizationAll
{
//סריליזציה של כל התכנית
public static void Serilization()
{
FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
string folder = folderBrowser.SelectedPath;
folder += @"\userData\data";//מוסיף לנתיב תיקיית משנה לשמירת הנתונים
DirectoryInfo directoryInfo = new DirectoryInfo(folder);
directoryInfo.Create();//יוצר את ספריות המשנה
serilizationList(folder);//קורא למתודה שמבצעת את הסריליזציה
}
}
//סריליזציה של כל הליסטים מקבלת את הערך של התיקייה לשמירת הנתונים
public static void serilizationList(string folder)
{
//יוצר את שמות הקבצים עבור כל הליסטים
string fileDonor = folder;
string fileDonation = folder;
string fileCredit = folder;
string fileBank = folder;
fileDonor += @"\donorList";
fileDonation += @"\donationList";
fileCredit += @"\creditCardList";
fileBank += @"\bankAccountList";
//יוצר אובייקטים המקבלים את רשימות הליסטים הקיימים בתוכנית
var donationObject = AddTorem.donations;
var donorsObject = AddTorem.donors;
var creditObject = AddTorem.credits;
var bankObjects = AddTorem.accounts;
//סריאליזציה עבור כל ליסט לקובץ נפרד
using (FileStream fs = new FileStream(fileDonor, FileMode.Create))
{
XmlSerializer donorXmlS = new XmlSerializer(typeof(List<Donor>));
donorXmlS.Serialize(fs, donorsObject);
}
using (FileStream donatStr = new FileStream(fileDonation, FileMode.Create))
{
XmlSerializer donationXmlS = new XmlSerializer(typeof(List<Donation>));
donationXmlS.Serialize(donatStr, donationObject);
}
using (FileStream creditStream = new FileStream(fileCredit, FileMode.Create))
{
XmlSerializer creditXmlS = new XmlSerializer(typeof(List<CreditCard>));
creditXmlS.Serialize(creditStream, creditObject);
}
using (FileStream bankStream = new FileStream(fileBank, FileMode.Create))
{
XmlSerializer bankXMLs = new XmlSerializer(typeof(List<BankAccount>));
bankXMLs.Serialize(bankStream, bankObjects);
}
}
//deserilization for all program
public static void Deserilization()
{
FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
if (folderBrowser.ShowDialog() == DialogResult.OK)
{
string folders = folderBrowser.SelectedPath;
folders += @"\userData\data";//מוסיף לנתיב את הנתיב לתיקיית משנה בה קיימים הנתונים
//קורא למתודות שמבצעות את הסריליזציה על התיקייה שנבחרה ומציב את הערך שמתקבל בליסטים הקיימים בתכנית
AddTorem.donors= DeserilizationDonor(folders);
AddTorem.donations = DeserilizationDonation(folders);
AddTorem.credits = DeserilizationCreditCard(folders);
AddTorem.accounts = DeserilizationBankAccount(folders);
}
}
private static List<BankAccount> DeserilizationBankAccount(string folders)
{
string fileBank = folders;
fileBank += @"\bankAccountList";//בוחר בקובץ הדרוש
var myObject = new List<BankAccount>();
using (FileStream fs = new FileStream(fileBank, FileMode.Open))
{
XmlSerializer xmlser = new XmlSerializer(typeof(List<BankAccount>));
myObject = (List<BankAccount>)xmlser.Deserialize(fs);
return myObject;
}
}
private static List<CreditCard> DeserilizationCreditCard(string folders)
{
string fileCredit = folders;
fileCredit += @"\creditCardList";
var myObject = new List<CreditCard>();
using (FileStream fs = new FileStream(fileCredit, FileMode.Open))
{
XmlSerializer xmlser = new XmlSerializer(typeof(List<CreditCard>));
myObject = (List<CreditCard>)xmlser.Deserialize(fs);
return myObject;
}
}
private static List<Donation> DeserilizationDonation(string folders)
{
string fileDonation = folders;
fileDonation += @"\donationList";
var myObject = new List<Donation>();
using (FileStream fs = new FileStream(fileDonation, FileMode.Open))
{
XmlSerializer xmlser = new XmlSerializer(typeof(List<Donation>));
myObject = (List<Donation>)xmlser.Deserialize(fs);
return myObject;
}
}
private static List<Donor> DeserilizationDonor(string folders)
{
string fileDonor = folders;
fileDonor += @"\donorList";
var myObject = new List<Donor>();
using (FileStream fs = new FileStream(fileDonor, FileMode.Open))
{
XmlSerializer xmlser = new XmlSerializer(typeof(List<Donor>));
myObject = (List<Donor>)xmlser.Deserialize(fs);
return myObject;
}
}
}
הכל עובד חלק!!! תודה רבה על העזרה והתמיכה!!
השאלה שלי היא האם אי אפשר לייעל את זה, כיון שבסוף נאלצתי לכתוב מתודה נפרדת לפתיחת כל ליסט. האם אי אפשר לכתוב מתודה גנרית שתדע לזהות לבד את הערך של כל ליסט הנשלח אליה ולחלץ אותו?
בטח זה אפשרי, אבל לא הצלחתי.. ניסיתי לכתוב במתודה List<T> אבל זה לא הצליח לי.. אז נאלצתי לכתוב 4 מתודות שבעצם עושות אותו דבר..
פורסם במקור בפורום CODE613 ב30/07/2015 15:50 (+03:00)