PDA

View Full Version : سوال: مشکل برنامه نویسی در مبحث فایل ها و استریمها



keiv@n
شنبه 02 اردیبهشت 1391, 14:04 عصر
با سلام
برنامه کوچکی نوشتم . نمی دونم متد deserialize چطوری به خوندن و چاپ کردن اطلاعات می پردازه . یه جایی خوندم که این عمل به صورت line به line انجام میشه !

ولی برنامه زیرو اجرا کردم و اطلاعات کلاس a با فشار دادن 2 بار button1 سه مرتبه و به صورت متوالی و پشت سر هم در فایل txt اورده شد. حالا اگه از متد deserialize استفاده کنم روش خوندن اطلاعات از فایلم چگونه خواهد بود؟
با تشکر




public partial class Form1 : Form
{
FileStream fs = new FileStream("D:\\New Text Document1.txt", FileMode.CreateNew, FileAccess.Write);
BinaryFormatter b = new BinaryFormatter();
a a1 = new a();
public Form1()
{
InitializeComponent();
b.Serialize(fs, a1);
}

private void button1_Click(object sender, EventArgs e)
{
b.Serialize(fs, a1);
}

private void button2_Click(object sender, EventArgs e)
{
fs.Close();
}
}
}
[Serializable]
public class a
{
public int x = 100;
public int y = 200;
public int z = 300;
}

gsearch
شنبه 02 اردیبهشت 1391, 16:13 عصر
برای خوندن می تونی به این صورت عمل کنی:

using (Stream stream = File.Open("file path", FileMode.Open))
{
BinaryFormatter bFormatter = new BinaryFormatter();
a newObj = bFormatter.Deserialize(stream) as a;
}

هر چند دفه که نوشتی باید بخونی تا کل اطلاعات رو دریافت کنی.

using (Stream stream = File.Open("file path", FileMode.Open))
{
BinaryFormatter bFormatter = new BinaryFormatter();
int n = 3;

a[] dataList = new a[n];
for (int i = 0; i < n; i++)
dataList[i] = bFormatter.Deserialize(stream) as a;
}

در ضمن این روشی که استفاده می کنی مناسب نیست.
بهتره اول کل اطلاعات رو دریافت کنی، بعد توی یه کلاس بریزی و بعد ذخیره کنی توی فایل.

موفق باشی.

keiv@n
شنبه 02 اردیبهشت 1391, 21:28 عصر
با سلام
میشه یه فایلو با یه ابجکت پر کرد و بعد اطلاعات اون فایلو داخل یه نوع ابجکت دیگه ریخت یه جورایی مثل استفاده از arraylist ؟
من امتحان کردم نشد گفت که باید از یک نوع ابجکت استفاده کنی یعنی compatible باشه.

gsearch
شنبه 02 اردیبهشت 1391, 23:06 عصر
خیر، هر داده ای رو نمی شه به هر شی تبدیل کرد.

اگه می خوای ArrayList ذخیره کنی اینجوری استفاده کن:

private void SaveLoadTest_Click(object sender, EventArgs e)
{
ArrayList list = new ArrayList();
list.Add(new a() { x = 1, y = 2, z = 3 });
list.Add(new a() { x = 4, y = 5, z = 6 });
list.Add(new a() { x = 7, y = 8, z = 9 });
list.Add(new a() { x = 44444, y = 22222, z = 3333 });
list.Add(new a() { x = 11111, y = 1111, z = 11111 });

SerializeArrayList(list);


ArrayList list2 = DeserializeArrayList();
}

private ArrayList DeserializeArrayList()
{
BinaryFormatter serializer = new BinaryFormatter();
using (var stream = File.OpenRead("test.dat"))
{
return (ArrayList)serializer.Deserialize(stream);
}
}


private void SerializeArrayList(ArrayList list)
{
BinaryFormatter serializer = new BinaryFormatter();
using (Stream stream = File.OpenWrite("test.dat"))
{
serializer.Serialize(stream, list);
}
}

فکر کنم گویاست. اگه لازم بود بگو تا بیشتر توضیح بدم.

keiv@n
یک شنبه 03 اردیبهشت 1391, 15:22 عصر
سلام
میشه منظور از اصطلاحات as و var که استفاده کردیدو بگید!
دفه اول میبینم
یه سوال sequential-access بهتره یا random-access ؟ کدوم کاراتره؟ مشکل sequential فقط جستجوی سرتاسریشه؟ یعنی کمی سرعتشه ؟
میبخشی زیاد سوال میکنما
متشکر

gsearch
یک شنبه 03 اردیبهشت 1391, 17:55 عصر
چیز خاصی نیست. توی این نسخه جدید سی شارپ استفاده می شه. as همون casting هست، مثل اینه که اینجوری بنویسی:
(a)bFormatter.Deserialize(stream)
بعضی جاها استفاده از این روش راحت تره.

var هم در واقع میاد خودش نوع متغییر رو در زمان کامپایل براساس مقداری که به اون نسبت دادی، مشخص می کنه. یه مقدار کد نویسی سریعتر می شه.
مثلا به جای
BinaryFormatter serializer = new BinaryFormatter();
میای می نویسی
var serializer = new BinaryFormatter();
خودش می فهمه که serializer رو از نوع BinaryFormatter هست و نیاز نیست توی یه خط دوبار BinaryFormatter رو تکرار کنی و...


در مورد نحوه دسترسی ترتیبی یا تصادفی بستگی داره چه سیستمی رو می خوای پیاده سازی کنی.
عملیاتی که بیشتر از همه توش انجام می شه چیه: درج و حذفه یا جستجو و...
در واقع بستگی به مسائل مربوط به ذخیره و بازیابی اطلاعات داره.
اونوقت تصمیم بگیری که از کدوم استفاده کنی.

keiv@n
پنج شنبه 07 اردیبهشت 1391, 20:01 عصر
با سلام ) منظور از دستور زیر چیست؟


System.Componentmodel.Container Components =null

keiv@n
یک شنبه 10 اردیبهشت 1391, 15:12 عصر
کسی نیست جواب منو بده ؟
ایول بابا....