PDA

View Full Version : کار با باینری فرمتر



saed2006
سه شنبه 26 آبان 1388, 16:28 عصر
برای کار با binaryformater یک کلاس تعریف کردم اما وقتی میخوام عمل serial رو انجام بدم
این
Assembly 'WindowsFormsApplication6, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable
میده

saed2006
سه شنبه 26 آبان 1388, 16:30 عصر
اینم کلاسی که میخوام سریال کنم


class DataContainer : ISerializable
{

public ArrayList ar;
public DataContainer(ArrayList ar)
{
this.ar = ar;
}
protected DataContainer(System.Runtime.Serialization.Seriali zationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
}

public void GetObjectData(System.Runtime.Serialization.Seriali zationInfo info, System.Runtime.Serialization.StreamingContext context)
{
}
}

saied_genius
چهارشنبه 27 آبان 1388, 08:41 صبح
سلام
من که تستش کردم هيچ error ي نمي دهد.

اين رو امتحان کن:


[Serializable]
class DataContainer : ISerializable
{

public ArrayList ar;
public DataContainer(ArrayList ar)
{
this.ar = ar;
}
protected DataContainer(System.Runtime.Serialization.Seriali zationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
}

[SecurityPermissionAttribute(SecurityAction.LinkDem and, Flags = SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(System.Runtime.Serialization.Seriali zationInfo info, System.Runtime.Serialization.StreamingContext context)
{
}
}

saied_genius
چهارشنبه 27 آبان 1388, 08:46 صبح
به اين لينک هم يه سر بزن:
http://www.codeproject.com/KB/dotnet/Surrogate_Serialization.aspx

موفق باشيد.

saed2006
چهارشنبه 27 آبان 1388, 12:24 عصر
eror رفع شد اما اطلاعاتی توش ذخیره نمیشه
یعنی موقع deserial اطلاعات بر نمیگرده
نباید توی اون دو تا متد بالا کدی نوشت؟

saed2006
چهارشنبه 27 آبان 1388, 13:00 عصر
من یک کلاس دارم که چند تا شی ازش ساختم حالا این چند شی رو میبرم توی یک arrylist از یک کلاس دیگه ذخیره میکنم و نتیجه رو باینری فرمت در میارم
ایا راهی که رفته ام اشتبا ه است؟
برای اینکه بتونم این arrylist رو به فرمت باینری در بیارم چه راه حلی دارین؟

Amir Oveisi
چهارشنبه 27 آبان 1388, 13:26 عصر
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.IO;

public void SaveToFile(ArrayList data)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = new FileStream("yourFileName", FileMode.Create);
formatter.Serialize(file, data);
}

public ArrayList LoadFromFile(string file)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fileStream = new FileStream(file, FileMode.Open);
return formatter.Deserialize(formatter) as ArrayList;
}

به این نکته توجه داشته باشین که کلاسی که توی ArrayList میریزین باید Serializeable باشه. برای این کار بالای کلاس یک Attribute اضافه بکنید با اسم Serializable:

[Serializable]
class MyClass
{
...
}

موفق باشید

saed2006
چهارشنبه 27 آبان 1388, 13:45 عصر
مشکل این هست که برای serial و deserail کردن یک متد دیگه ای هم باید اجرا بشه
اسمش
public void GetObjectData(System.Runtime.Serialization.Seriali zationInfo info, System.Runtime.Serialization.StreamingContext context)
{
توی این چی بنویسم که مشکل حل بشه
الان با نوشتن کد های شما مقادیر null برمیگردونه

saied_genius
چهارشنبه 27 آبان 1388, 14:00 عصر
اين رو امتحان کن ، تست کردم ، جواب مي دهد.


using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public ArrayList ar = new ArrayList();

public void SaveToFile(ArrayList data)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = new FileStream("c:\\test.opl", FileMode.Create);
formatter.Serialize(file, data);
}

public ArrayList LoadFromFile(string file)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fileStream = new FileStream(file, FileMode.Open);
return (ArrayList)formatter.Deserialize(fileStream);
}

private void button1_Click(object sender, EventArgs e)
{
ar.Add("1");
ar.Add("2");
ar.Add("3");
ar.Add("4");
ar.Add("5");
ar.Add("6");
ar.Add("7");
ar.Add("8");
ar.Add("9");
ar.Add("10");
SaveToFile(ar);
}

private void button2_Click(object sender, EventArgs e)
{
ArrayList arr = LoadFromFile("c:\\test.opl");
}

}
}
يه نمونه به صورت پروژه هم قرار دادم.

موفق باشيد.

saed2006
چهارشنبه 27 آبان 1388, 14:40 عصر
ممنون
ببینید توی arrylist من تعدادی ابجکت از یک کلاس وجود داره
اینم کدش:


[Serializable]


class moshakhast: ISerializable
{

public string Path;
public double gotralangoo;
public double PahnaGol;
public double pahnaialango;
public double RotateAngle;
public int goldoor;
public string noetekrardor;
public double valuenoetekrardor;
public string noecharkhesh;
public double faselearz;
public int numarz;
public double ekhtelafaz;
public bool mehvarcharom;
public double anglemasirharkt;
public double speedmiz;
public double speedcharkheshabzar;
public double speedharktamodi;
public double mizanjabejaimehvarheyn;
public double mizanjabejaimehvarenteha;
public int shomareabzar;
public string noeabzar;
public double mizanebardehi;
public bool ejraenhena;
public bool noeenhenamogr;
public double mizanenhena;
public bool noghtezani;
public bool chidmanhoshmand;
public string noenoghte;
public double tedadnoghte;
public double gotrnoghte;
public bool chasbidandartool;
public bool chasbidandarpahna;



public object SetObjectData(object obj, SerializationInfo info,
StreamingContext context, ISurrogateSelector selector)
{
}
public moshakhast(System.Runtime.Serialization.Serializat ionInfo info,
System.Runtime.Serialization.StreamingContext context)
{
info.GetValue("h", this.GetType());
}
public moshakhast()
{
}
[SecurityPermissionAttribute(SecurityAction.LinkDem and, Flags = SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(System.Runtime.Serialization.Seriali zationInfo info, System.Runtime.Serialization.StreamingContext context)
{
info.AddValue("h", this);
}





public void SaveToFile()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream file = new FileStream(saveFileDialog2.FileName, FileMode.Create);
formatter.Serialize(file, data);
}

public ArrayList LoadFromFile(string file)
{
BinaryFormatter formatter = new BinaryFormatter();
Stream fileStream = new FileStream(file, FileMode.Open);
return (ArrayList)formatter.Deserialize(fileStream);
}

saied_genius
چهارشنبه 27 آبان 1388, 14:49 عصر
نگفتيد مشکلتون کجاست ، ولي من که نگاه کردم، متد saveToFile شما هيچ ورودي نمي گيرد ، که بايد آرايه object خود را به صورت arrayList به عنوان پارامتر متد به آن پاس دهيد.

(پست قبلي من را دقت کنيد و يا سورس کد نمونه را يه نگاه بيندازيد.)
موفق باشيد.

saed2006
چهارشنبه 27 آبان 1388, 15:10 عصر
من چون متغیر رو global تعریف کردم دیگه پاس ندادم به متد
اما مشکل اینه که به تعداد اون شی ایجاد میشه اما مقادیرش null ذخیره میشه

saied_genius
چهارشنبه 27 آبان 1388, 15:13 عصر
ربطي به global بودن يا نبودن ندارد.

شما اگر مي خواهيد اون شکلي کار کنيد بايد از نوع static تعريف کنيد تا متغير در تمام پروژه به صورت ذخيره شده باقي بماند ، در غير اينصورت همان null را با تعداد عناصر بر مي گرداند.

موفق باشيد.

saed2006
چهارشنبه 27 آبان 1388, 15:53 عصر
ببینید متغیر data همان arrylist من هست و هنگامی که میخواد serial بشه توش مقادیر هست اما موقع deserial null برمیگردونه
یعنی درست ذخیره میشه اما خوانده نمیشه

hoorfar
چهارشنبه 27 آبان 1388, 22:04 عصر
احتیاجی نیست از اینترفیس ISerializable استفاده کنی




using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;


namespace ConsoleApplication1
{
[Serializable]
public class MySubClass
{
public string Name, Family;
public int ID;
public MySubClass() { }
public MySubClass(int id, string name, string family)
{
this.ID = id;
this.Name = name;
this.Family = family;
}

public override string ToString()
{
return string.Format("{0} {1} {2}", ID, Name, Family); ;
}
}


[Serializable]
public class SerClass
{
public ArrayList MyList = new ArrayList();


public SerClass()
{
}
}


class Program
{
static void Main(string[] args)
{
SerClass ss = new SerClass();
for (int i = 0; i < 100; i++)
ss.MyList.Add(new MySubClass(i, "Name" + i.ToString(), "Family" + i.ToString()));


BinaryFormatter man = new BinaryFormatter();
StreamWriter writer = new StreamWriter("w.txt", false);
man.Serialize(writer.BaseStream, ss);
writer.Close();


StreamReader reader = new StreamReader("w.txt");
SerClass ds = (SerClass)man.Deserialize(reader.BaseStream);
reader.Close();

foreach (object obj in ds.MyList)
Console.WriteLine(obj);
}
}
}