دوستان من یک ارایه 2 بعدی int دارم
من میخام اونارو در فایل txt ذخیره کنم و در form load هم مقدار ارایه رو از فایل txt بخونه
ممنون
دوستان من یک ارایه 2 بعدی int دارم
من میخام اونارو در فایل txt ذخیره کنم و در form load هم مقدار ارایه رو از فایل txt بخونه
ممنون
من متدهايي براي binary serialize و deserialize كردن نوشتم كه از آن استفاده مي كنم:
public static void BinaryFileSerialize(Object obj, string filePath)
{
FileStream fileStream = null;
try
{
fileStream = new FileStream(filePath, FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fileStream, obj);
}
catch
{
throw;
}
finally
{
if (fileStream != null)
fileStream.Close();
}
}
public static T BinaryFileDeSerialize<T>(string filePath)
{
FileStream fileStream = null;
Object obj;
try
{
if (File.Exists(filePath) == false)
throw new FileNotFoundException("The file" + filePath + " was not found.", filePath);
fileStream = new FileStream(filePath, FileMode.Open);
BinaryFormatter b = new BinaryFormatter();
obj = b.Deserialize(fileStream);
}
catch
{
throw;
}
finally
{
if (fileStream != null)
fileStream.Close();
}
return (T)obj;
}
مثلا:
int[,] myArray = new int[2,3];
myArray[0, 0] = 1;
myArray[0, 2] = 2;
BinaryFileSerialize(myArray, "c:\\test.txt");
int[,] loadedArray = BinaryFileDeSerialize<int[,]>("c:\\test.txt");
شما مي تونيد از دو فايل متني براي ذخيره ي اعداد استفاده كنيد!
اگر اسرار داريد كار با يك فايل انجام شود بايد كمي پردازش رشته انجام دهيد. به اين صورت كه عناصر را به صورت x,a,b ذخيره كنيد و سپس هنگام خواندن آن ها را از يك ديگر جدا كنيد و دوباره به صورت عددي در آرايه ذخيره كنيد.
اصلا هم سخت نيست!
اين تابع يك رشته ي ويرگول دار را از جاي ويرگول دو تكه مي كند!
void Seperate(string source,ref string partA,ref string partB)
{
bool flag = false;
partA = string.Empty;
partB = string.Empty;
if (!source.Contains(",")) return;
foreach (char c in source)
{
if (!flag && c != ',')
partA += c;
if (flag && c != ',')
partB += c;
if (c == ',')
flag = true;
}
}
سلام.
- کدی که نوشتید زیاد خوانا نیست. شما Try/Catch گذاشتید، اما توی Catch دارید دوباره Throw می کنید که این کار بی مورد هستش. می تونستید از Try/Finally استفاده کنید، و Catch Block رو ننویسید. البته اونهم به نظر من چندان جالب نیست. بهترین حالت، نوشتن متود مزبور به این شکل هستش:
public static void BinaryFileSerialize(Object obj, string filePath)
{
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
{
BinaryFormatter b = new BinaryFormatter();
b.Serialize(fileStream, obj);
}
}
به این ترتیب با خارج شدن از using block، آبجکت مربوطه (FileStream) بطور خودکار Dispose میشه...
- کد شما از BinaryFormatter استفاده می کنه. ایشون پرسیدن چطور میشه در یک فایل TEXT مقادیر رو نوشت، در صورتیکه فایلی که شما با BinaryFormatter ایجاد می کنید، Binary خواهد بود. ضمنا، فایل فقط شامل اطلاعات مورد نظر شما نیست و بسته به اینکه چه Object ای رو Serialize کنید، اطلاعات Assembly مربوطه هم میتونه داخل فایل قرار بگیره. این اطلاعات، هنگام Deserialize کردن Object مورد استفاده قرار خواهد گرفت.
منطقيه.کدی که نوشتید زیاد خوانا نیست. شما Try/Catch گذاشتید، اما توی Catch دارید دوباره Throw می کنید
قبل از پست كردن كد هاي داخل بلوك catch را حذف كردم، شايد بهتر بود كلا catch را حذف مي كردم.
استفاده از using statement كد منظم و كمتري است، كلا مشكلي كه با using statement دارم اين است كه اگر در constructor مشكلي بوجد آمد نمي توان از آن در همين بلوك مطلع شد و استفاده از يك Try/Catch ديگر لازم استبهترین حالت، نوشتن متود مزبور به این شکل هستش
فايل متني لزوما به معني plain text نيست، در هر حال قبول دارم كه با seialize كردن اطلاعات كد شده و بسته به نوع assembly اطلاعات بيشتري هم در مورد assembly در فايل قرار مي گيردایشون پرسیدن چطور میشه در یک فایل TEXT مقادیر رو نوشت،
درضمن MultidimensionalArray رو به این روش نمیشه Serilize کرد .int[][] jaggedArray = {
new int[] {1,2,3,4,128},
new int[] {1,2,3,128},
new int[] {1,2,128}
};
XmlSerializer serializer = new XmlSerializer(jaggedArray.GetType());
using (FileStream fStream = File.Create("C:\\jaggedArray.txt"))
{
serializer.Serialize(fStream, jaggedArray);
}
توصیه میکنم برای اطلاعات بیشتر به سایت JSON.org بری
ممنون دوستان
ولی 2 تا مشکل هست
من با کد پست شماره 2 نوشتم
اولا که در فایل txt به جای عدد یه مشت چیزای نا مفهوم میاد
دوم اینکه حالا چه طوری از فایل بخونم و در ارایه بزارم
ممنون
1- اگر در فايل text دقيقا اعداد يا فرمت خاصي را مي خواهيد بايد متد خاصي هم براي serialization بنويسيد، اگر صرف دسترسي به فايل به صورت خوانا كافي است از xml يا soap serialization مي توانيد استفاده كنيد.
soap serialization:
لازم است ابتدا System.Runtime.Serialization.Formatters.Soap را add reference كنيد
public static void SoapFileSerialize(object obj, string filePath, Encoding encodingType)
{
using (Stream stream = new MemoryStream())
{
SoapFormatter sf = new SoapFormatter();
sf.Serialize(stream, obj);
stream.Position = 0;
byte[] b = new byte[stream.Length];
stream.Read(b, 0, (int)stream.Length);
using (StreamWriter sw = new StreamWriter(filePath, false, encodingType))
{
sw.Write(encodingType.GetString(b, 0, b.Length));
}
}
}
public static T SoapFileDeSerialize<T>(string filePath)
{
Object obj;
if (File.Exists(filePath) == false)
throw new FileNotFoundException("The file" + filePath + " was not found.", filePath);
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
SoapFormatter sf = new SoapFormatter();
obj = (object)sf.Deserialize(fileStream);
}
return (T)obj;
}
براي استفاده:
int[][] jaggedArray = newint[2][];
jaggedArray[0] = newint[2];
jaggedArray[1] = newint[2];
jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;
jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
SoapFileSerialize(jaggedArray, "c:\\test.txt", Encoding.UTF8);
int[][] loadedJaggedArray = SoapFileDeSerialize<int[][]>("c:\\test.txt");
save و load كردن مجدد پشت سر هم نوشته شده است
آخرین ویرایش به وسیله prankster : چهارشنبه 09 اردیبهشت 1388 در 14:41 عصر