PDA

View Full Version : سوال: نحوه ذخیره و بازیابی اطلاعات به وسیله serialization در دیسک



hawk_eye
یک شنبه 11 خرداد 1393, 18:03 عصر
سلام.پروژه ای دارم بنویسم که یه کلاس پایه به نام شخص داره و دو کلاس دانشجو و استاد از کلاس پایه ارث میبرند و یک کلاس درس نیز وجود داره.کلاس دانشجو باید تابعی مثل Add course دارشته باشه که به صورت چند ریختی از کلاس پایه خود (شخص) به ارث ببره و پیاده سازی مجدد گردد.
میخوام یه لیست باکس داشته باشم که مشخصات دانشجویان در آن لیست شده باشه و با انتخاب هر سطح در listview یا listbox مشخصات دروس اخذ شده را از فایل نمایش دهد و با گزینه اضافه کردن درس انتخاب واحد انجام شود.
نمی دونم چطور باید از مکانیزم serialization برای ذخیره و بازیابی اطلاعات استفاده کنم.لطفا راهنمایی کنید.

Mahmoud.Afrad
سه شنبه 13 خرداد 1393, 17:27 عصر
کدهایی که تا الان نوشتی رو بزار.

hawk_eye
چهارشنبه 14 خرداد 1393, 14:33 عصر
کدهایی که تا الان نوشتی رو بزار.
کلاس ها رو نوشتم فقط که هنوز تکمیل نیس.یه کد از نحوه استفاده از شیوه serialization رو برام بنویسی کارم راه میوفته.

Mahmoud.Afrad
چهارشنبه 14 خرداد 1393, 15:30 عصر
میتونی با جستجو مثالهای زیادی رو هم در msdn و هم سایتهای دیگه پیدا کنی.

کلاس ها رو با Attribute زیر مشخص میکنی

[Serializable]
class MyClass
{
//...
}

حالا فرضا یک لیست از این کلاس داری
List<MyClass> mc = new List<MyClass>();
که بعد از مقداردهی به این لیست
به این صورت ذخیره میکنی

private void Save()
{
BinaryFormatter bf = new BinaryFormatter();
using (Stream sw = File.Open(Application.StartupPath + "//MM", FileMode.OpenOrCreate))
{
bf.Serialize(sw, mc);
}
}

به این صورت هم میخونی و تبدیل به لیست میکنی:

private void Load()
{
BinaryFormatter bf = new BinaryFormatter();
using (Stream sr = File.Open(Application.StartupPath + "//MM", FileMode.Open))
{
object obj = bf.Deserialize(sr);
mc = obj as List<MyClass>;
}
}


برای اینکه به ازای هر لیست یک فایل نداشته باشی میتونی همه کلاسها و متدهای مورد نیازت رو در یک کلاس مثلا به نام University قرار بدی و موقع ذخیره و بازیابی شئ ای از این کلاس رو ذخیره و بازیابی کنی تا یک فایل داشته باشی.

hawk_eye
پنج شنبه 15 خرداد 1393, 18:35 عصر
برای اینکه به ازای هر لیست یک فایل نداشته باشی میتونی همه کلاسها و متدهای مورد نیازت رو در یک کلاس مثلا به نام University قرار بدی و موقع ذخیره و بازیابی شئ ای از این کلاس رو ذخیره و بازیابی کنی تا یک فایل داشته باشی.

دقیقا نمیدونم چطور پیاده سازیش کنم.یعنی کلاس پایه رو University کنم؟خراب میشه اینطوری تمام کلاسهام.

Mahmoud.Afrad
پنج شنبه 15 خرداد 1393, 19:55 عصر
نه، منظورم اینه که همه کلاسهات رو در یک کلاس به اسم University قرار بدی و شئ ای ازش بسازی و ...
ذخیره و بازیابی رو هم با همین شئ انجام بدی

[Serializable]
class University
{
[Serializable]
abstract public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}
[Serializable]
public class Student : Person
{

}
[Serializable]
class Teacher : Person
{

}

[Serializable]
class Course
{

}

List<Student> _students;

internal List<Student> Students
{
get { return _students; }
set { _students = value; }
}

List<Teacher> _teachers;

internal List<Teacher> Teachers
{
get { return _teachers; }
set { _teachers = value; }
}

public University()
{
Students = new List<Student>();
Teachers = new List<Teacher>();
}
}


private void Save(University u)
{
BinaryFormatter bf = new BinaryFormatter();
using (Stream sw = File.Open(Application.StartupPath + "//MM", FileMode.Create))
{
bf.Serialize(sw, u);
}
}

private University Load()
{
BinaryFormatter bf = new BinaryFormatter();
using (Stream sr = File.Open(Application.StartupPath + "//MM", FileMode.Open))
{
object obj = bf.Deserialize(sr);
return obj as University;
}
}

hawk_eye
جمعه 16 خرداد 1393, 12:39 عصر
در رابطه با خط 32 تا 54 یه توضیحی میدی؟

Mahmoud.Afrad
جمعه 16 خرداد 1393, 12:50 عصر
خط 32 یک فیلد از جنس لیستی از دانش آموزان هست. خط 34 تعریف پراپرتی دانش آموزان هست که فیلد خط قبلی رو کپسوله کرده (در مورد تعریف پراپرتی تحقیق کن)
خط 54 هم که خالیه. دقیقا کدوم خط.
بهتره کدهای خودت رو بزاری. و اگر قابل فهم نیست بهتره بی خیال کد من بشی و کد خودت رو درست کنی.

hawk_eye
جمعه 16 خرداد 1393, 12:54 عصر
خط 32 یک فیلد از جنس لیستی از دانش آموزان هست. خط 34 تعریف پراپرتی دانش آموزان هست که فیلد خط قبلی رو کپسوله کرده (در مورد تعریف پراپرتی تحقیق کن)
خط 54 هم که خالیه. دقیقا کدوم خط.
بهتره کدهای خودت رو بزاری. و اگر قابل فهم نیست بهتره بی خیال کد من بشی و کد خودت رو درست کنی.

کد هارو متوجه ام ولی می خوام بدونم ضروریه؟نمیشه بعد کلیک رو دکمه لیست رو بسازم؟

Mahmoud.Afrad
جمعه 16 خرداد 1393, 14:14 عصر
نه مشکلی نداره در این حالت لیستی که ساختی رو به پارامتر دوم Serialize نسبت میدی(نکته مهم اینه که کلاسهات رو با attribute معرفی شده مشخص کنی. لیست و آرایه و... همه آبجکت هستند و پارامتر دوم Serialize اونها رو میپذیره.).

hawk_eye
جمعه 16 خرداد 1393, 14:51 عصر
بعد از load کردن فایل حاوی اطلاعات چطور به لیست باکس یا لیست ویو انتقال بدم؟

hawk_eye
شنبه 17 خرداد 1393, 17:31 عصر
private void button2_Click(object sender, EventArgs e)
{
List<daneshgah.University.Course> a = new List<daneshgah.University.Course>();
BinaryFormatter bl = new BinaryFormatter();
using (Stream sr = File.Open(Application.StartupPath + "//MM.txt", FileMode.Open))
{
object obj = bl.Deserialize(sr);

a= obj as List<daneshgah.University.Course>;

foreach (daneshgah.University.Course child in a)
{
listBox2.Items.Add(child);
sr.Close();
}
}
}

این کد فقط آخرین متنی که در فایل ذخیره کردم رو در لیست باکس نمایش میده.من میخوام تمام ورودی ایی که ذخیره کردم رو نمایش بده.

hawk_eye
یک شنبه 25 خرداد 1393, 15:31 عصر
اگه لطف کنید جواب بدید خیلی ممنون میشم.بخدا خیلی زمان ندارم.

Mahmoud.Afrad
پنج شنبه 29 خرداد 1393, 17:57 عصر
private void button2_Click(object sender, EventArgs e)
{
List<daneshgah.University.Course> a = new List<daneshgah.University.Course>();
BinaryFormatter bl = new BinaryFormatter();
using (Stream sr = File.Open(Application.StartupPath + "//MM.txt", FileMode.Open))
{
object obj = bl.Deserialize(sr);

a= obj as List<daneshgah.University.Course>;

foreach (daneshgah.University.Course child in a)
{
listBox2.Items.Add(child);
sr.Close();
}
}
}

این کد فقط آخرین متنی که در فایل ذخیره کردم رو در لیست باکس نمایش میده.من میخوام تمام ورودی ایی که ذخیره کردم رو نمایش بده.
اینکه کد لود هستش. باید کد ذخیره رو بزاری.
احتمالا در دکمه ذخیره لیست جدید رو میسازی یکی بهش اضافه میکنی و ذخیره میکنی در حالی که در لودفرم یا سازنده فرم باید لیست رو بسازی.