PDA

View Full Version : سوال: سریالی کردن کلاس



HDDSoft2001
چهارشنبه 31 شهریور 1389, 19:16 عصر
با سلام خدمت تمامی دوستان

آقا من دارم یک چیزی مثل membership می نویسم. مشکل من اینجاست که من یه جدول پروفایل ساختم (مثل همون ممبرشیب مایکروسافت) که یک ستون از نوع باینری داره. خب یعنی اینکه هر چیزی خواستم بریزم توش بعد بازیابیش کنم. حالا مشکل من همینجاست که نمیدونم چطوری باید این دادهای متغیرمو به شکل آرایه ای از بایتها دربیارم و دوباره از آرایه ای از بایت ها به شکل اولیه تبدیلش کنم. این کار واسه اینکه طرفو (کاربری که دارای در جدول کاربران ثبت است) محدود نکنم که حتما نمیدونم نام و فامیل رو بخاد ذخیره کنه و اینا. بلکه کاری کردم که طرف بیاد یه کلاس با فیلدهای دلخواه ایجاد کنه, بعد دادهای این کلاس رو بیاد تبدیل کنه به آرایه ای از بایتها که بتونم در دیتابیس ذخیره کنم و همچنین بازیابی. حالا اگه هرکی فهمید ما چی می گیم, خواهشمندم کمکم کنید.
بصورت ساده تر: یک کلاس رو بتونم دردیتابیس بصورت باینری ذخیره و بازیابی کنم . (دیتابیس اس کیوال سرور).

با تشکر فراوان

HDDSoft2001
پنج شنبه 01 مهر 1389, 23:44 عصر
با سلام
آقا یعنی واقعا کسی اینو بلد نیست!!!!!!!!!!!
ناامید شدم واقعا!!

با تشکر

flash118
جمعه 02 مهر 1389, 05:47 صبح
دوست عزیز شما می تونی از convert ها استفاده کنی البته با روش خاص خودتون من برای یک نرم افزاری که برای امنیتش کلاس کدم رو به باینری کانورت میکردم بایه روش خاص درون جدول ذخیره میکردم و موقعی که نیاز بود ازش کانورت معکوس میکردم الته حجم داده ها بالا می ره توصیه میکنم روش دیگه جایگزین کنید اگه از لحاظ فضا مشکلی براتون نیست میتونید استفاده کنید ولی کمی زمان می بره

HDDSoft2001
جمعه 02 مهر 1389, 10:31 صبح
با سلام
آقا ممنون بالاخره یکی جواب داد. دوست خوبم حرف شما صحیح ولی کلاسش اینقد بزرگ نیست خیلی باشه 7 8 تا فیلد او نوع استرینگه. فکرشو کردم. ولی نمیدونم چجوری به باینری نبدیلش کنم, اگه میشه کدی چیزی بزارید ببینم.
بازم خیلی ممون

cheshm6k
جمعه 02 مهر 1389, 13:57 عصر
سلام .

توی تاپیک 1001 نکته دنبال سریالیزیشن بگردید. مبحث Serialize کردن باینری آبجکت در فایل به شما کمک خواهد کرد.

موفق باشید.

HDDSoft2001
شنبه 03 مهر 1389, 00:32 صبح
با سلام
راستش یه چیزایی پیدا کردم ولی مشکل اینکه داخل این کلاسم یک کلاس دیگه تعریف شده(یکی از فیلدهای کلاسم از نوع یک کلاس دیگست) فقط سر همین فیلده خطا میگیره! اگه راحلی دارین کمک کنید.
یک سوال دیگه اینکه من تونستم با xmlSerialized این کارو انجام بدم, ولی با binySerialized نشد و موقع DeSerialized کردن مشکلی نداره و فقط موقع casting خطا میده و میگه این چیزی که deSerialized شده از این نوع نمی باشد.

قسمت استراکچر برنامه و دادهای اولیه:




public class Profile : IProfile<ProfileStructure>
{
public ProfileStructure ProfileData { get; set; }

public Profile()
{
ProfileData = new ProfileStructure();
}

این تابع مشکل داره
public string GetDataSerialized()
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();

// ----- this code is succefull, but when DeSerialized error! -----
//BinaryFormatter bs = new BinaryFormatter();
//bs.Serialize(ms, ProfileData.GetType());
//return System.Text.Encoding.ASCII.GetString(ms.ToArray()) ;

XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
seri.Serialize(ms, ProfileData);

return data;
}
finally { if (ms != null)ms.Dispose(); }
}

این تابع مشکل داره:
public void LoadDataSerialized(string data)
{
byte[] byt = System.Text.Encoding.ASCII.GetBytes(data);

MemoryStream ms = new MemoryStream();
ms.Write(byt, 0, data.Length);
ms.Seek(0, SeekOrigin.Begin);


// ---- Binary methood for Deserialize, But error every Time
//BinaryFormatter bs = new BinaryFormatter();
//this.ProfileData = (ProfileStructure)bs.Deserialize(ms); // ---- error

// ---- other methood for Deserialize, but error just field type is Class
XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
this.ProfileData = (ProfileStructure)seri.Deserialize(ms);
}
}

// ----------------------------------------------

public interface IProfile<T>
{
// Get data Serialized for save in database
string GetDataSerialized();

// read from database and load by this methood
void LoadDataSerialized(string data);

T ProfileData { set; get; }
}

// Profile Structure
public class ProfileStructure
{
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public string Theme { get; set; }
public string PostalCode { get; set; }
public string NationalCode { get; set; }
public string Address { get; set; }
public IBasketUser Basket { get; set; }
}

// ----------------------------------------------

// Basket Structure
public interface IBasketUser
{
void AddItem(int ID_Part, int Count_Part);
void DeleteItem(int ID_Part);
Dictionary<int, int> GetListProduct { set; get; }
}

public class BasketUser : IBasketUser
{
public BasketUser()
{
GetListProduct = new Dictionary<int, int>();
}

public void AddItem(int ID_Part, int Count_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct[ID_Part] = Count_Part;
else
GetListProduct.Add(ID_Part, Count_Part);

}
public void DeleteItem(int ID_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct.Remove(ID_Part);
}
public Dictionary<int, int> GetListProduct
{
get; set;
}

}


استفاده ی از قسمت بالا:




Profile pf = new Profile();
pf.ProfileData.Name = "Hossein";
pf.ProfileData.Family = "Tavasoli";
pf.ProfileData.Tell = "6535358";
pf.ProfileData.Address = "Iran";

pf.ProfileData.Basket = new BasketUser();
pf.ProfileData.Basket.AddItem(1, 1);
pf.ProfileData.Basket.AddItem(6, 3);

string data = pf.GetDataSerialized();

pf.LoadDataSerialized(data);

HDDSoft2001
شنبه 03 مهر 1389, 02:53 صبح
با سلام
راستش یه چیزایی پیدا کردم ولی مشکل اینکه داخل این کلاسم یک کلاس دیگه تعریف شده(یکی از فیلدهای کلاسم از نوع یک کلاس دیگست) فقط سر همین فیلده خطا میگیره! اگه راحلی دارین کمک کنید.
یک سوال دیگه اینکه من تونستم با xmlSerialized این کارو انجام بدم, ولی با binySerialized نشد و موقع DeSerialized کردن مشکلی نداره و فقط موقع casting خطا میده و میگه این چیزی که deSerialized شده از این نوع نمی باشد.

قسمت استراکچر برنامه و دادهای اولیه:




public class Profile : IProfile<ProfileStructure>
{
public ProfileStructure ProfileData { get; set; }

public Profile()
{
ProfileData = new ProfileStructure();
}

این تابع مشکل داره
public string GetDataSerialized()
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();

// ----- this code is succefull, but when DeSerialized error! -----
//BinaryFormatter bs = new BinaryFormatter();
//bs.Serialize(ms, ProfileData.GetType());
//return System.Text.Encoding.ASCII.GetString(ms.ToArray()) ;

XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
seri.Serialize(ms, ProfileData);

return data;
}
finally { if (ms != null)ms.Dispose(); }
}

این تابع مشکل داره:
public void LoadDataSerialized(string data)
{
byte[] byt = System.Text.Encoding.ASCII.GetBytes(data);

MemoryStream ms = new MemoryStream();
ms.Write(byt, 0, data.Length);
ms.Seek(0, SeekOrigin.Begin);


// ---- Binary methood for Deserialize, But error every Time
//BinaryFormatter bs = new BinaryFormatter();
//this.ProfileData = (ProfileStructure)bs.Deserialize(ms); // ---- error

// ---- other methood for Deserialize, but error just field type is Class
XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
this.ProfileData = (ProfileStructure)seri.Deserialize(ms);
}
}

// ----------------------------------------------

public interface IProfile<T>
{
// Get data Serialized for save in database
string GetDataSerialized();

// read from database and load by this methood
void LoadDataSerialized(string data);

T ProfileData { set; get; }
}

// Profile Structure
public class ProfileStructure
{
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public string Theme { get; set; }
public string PostalCode { get; set; }
public string NationalCode { get; set; }
public string Address { get; set; }
public IBasketUser Basket { get; set; }
}

// ----------------------------------------------

// Basket Structure
public interface IBasketUser
{
void AddItem(int ID_Part, int Count_Part);
void DeleteItem(int ID_Part);
Dictionary<int, int> GetListProduct { set; get; }
}

public class BasketUser : IBasketUser
{
public BasketUser()
{
GetListProduct = new Dictionary<int, int>();
}

public void AddItem(int ID_Part, int Count_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct[ID_Part] = Count_Part;
else
GetListProduct.Add(ID_Part, Count_Part);

}
public void DeleteItem(int ID_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct.Remove(ID_Part);
}
public Dictionary<int, int> GetListProduct
{
get; set;
}

}


استفاده ی از قسمت بالا:




Profile pf = new Profile();
pf.ProfileData.Name = "Hossein";
pf.ProfileData.Family = "Tavasoli";
pf.ProfileData.Tell = "6535358";
pf.ProfileData.Address = "Iran";

pf.ProfileData.Basket = new BasketUser();
pf.ProfileData.Basket.AddItem(1, 1);
pf.ProfileData.Basket.AddItem(6, 3);

string data = pf.GetDataSerialized();

pf.LoadDataSerialized(data);




آقا این کدی که نوشتمو خودم بالاخره مشکلشو پیدا کردم, واسه همین پاکش نکردم که بقیه اشتباره منو نکنن:
خب اولین اشتباهم این بود که کلاس هایی که میخاستم سریالی بشه را, خاصیت [serialized] نذاشتم, توجه کنید واسه کلاس BasketUser نذاشتم.
دومین اشتباه موقع DeSerializ کردن بود که من به روش CastingType عمل می کردم که اشتباده بود و واسه همین خطا می داد. تو یه سایت از روش زیر استفاده کرده بود.



MyClass c = DeSrialized(myStrim) as MyClass;


همین!!!!!!!!!!!!:عصبانی++:

اینم کد نهایی که هر کسی مثل من کار کنه داشته باشه:


ساختار کلاس ها:



public class Profile : IProfile<ProfileStructure>
{
public ProfileStructure ProfileData { get; set; }

public Profile()
{
ProfileData = new ProfileStructure();
}

public byte[] GetDataSerialized()
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();

BinaryFormatter bs = new BinaryFormatter();
bs.Serialize(ms, ProfileData);

return ms.ToArray();
}
finally { if (ms != null)ms.Dispose(); }
}

public void LoadDataSerialized(byte[] data)
{
if (data == null)
throw new Exception("the data serialized is empty.");

MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length);

// for next line get error, becuase 'posion indicator stream' when ms.Write(...) move to last posion
// of stram, and opration of 'bs.Deserialize(ms)', need the 'indicator stream' move first strem.
ms.Seek(0, SeekOrigin.Begin);

BinaryFormatter bs = new BinaryFormatter();

ProfileStructure prof = bs.Deserialize(ms) as ProfileStructure;

if (prof == null)
throw new Exception("the Desrialized not Successful.");
else
this.ProfileData = prof;
}
}

// ----------------------------------------------

public interface IProfile<T>
{
// Get data Serialized for save in database
byte[] GetDataSerialized();

// read from database and load by this methood
void LoadDataSerialized(byte[] data);

T ProfileData { get; }
}

// Profile Structure
[Serializable]
public class ProfileStructure
{
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public string Theme { get; set; }
public string PostalCode { get; set; }
public string NationalCode { get; set; }
public string Address { get; set; }
public IBasketUser Basket { get; set; }
}

// ----------------------------------------------

// Basket Structure
public interface IBasketUser
{
void AddItem(int ID_Part, int Count_Part);
void DeleteItem(int ID_Part);
Dictionary<int, int> GetListProduct { get; }
}

[Serializable]
public class BasketUser : IBasketUser
{
public BasketUser()
{
GetListProduct = new Dictionary<int, int>();
}

public void AddItem(int ID_Part, int Count_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct[ID_Part] = Count_Part;
else
GetListProduct.Add(ID_Part, Count_Part);

}
public void DeleteItem(int ID_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct.Remove(ID_Part);
}
public Dictionary<int, int> GetListProduct
{
get;
set;
}
}







استفاده از ساختار:



Profile pf = new Profile();
pf.ProfileData.Name = "Hossein";
pf.ProfileData.Family = "Tavasoli";
pf.ProfileData.Tell = "6535358";
pf.ProfileData.Address = "Iran";

pf.ProfileData.Basket = new BasketUser();
pf.ProfileData.Basket.AddItem(1, 1);
pf.ProfileData.Basket.AddItem(6, 3);

byte[] data = pf.GetDataSerialized();

pf.ProfileData.Basket = null;
pf.ProfileData.Name = "reza";

pf.LoadDataSerialized(data);

HDDSoft2001
شنبه 03 مهر 1389, 02:59 صبح
با سلام
راستش یه چیزایی پیدا کردم ولی مشکل اینکه داخل این کلاسم یک کلاس دیگه تعریف شده(یکی از فیلدهای کلاسم از نوع یک کلاس دیگست) فقط سر همین فیلده خطا میگیره! اگه راحلی دارین کمک کنید.
یک سوال دیگه اینکه من تونستم با xmlSerialized این کارو انجام بدم, ولی با binySerialized نشد و موقع DeSerialized کردن مشکلی نداره و فقط موقع casting خطا میده و میگه این چیزی که deSerialized شده از این نوع نمی باشد.

قسمت استراکچر برنامه و دادهای اولیه:




public class Profile : IProfile<ProfileStructure>
{
public ProfileStructure ProfileData { get; set; }

public Profile()
{
ProfileData = new ProfileStructure();
}

این تابع مشکل داره
public string GetDataSerialized()
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();

// ----- this code is succefull, but when DeSerialized error! -----
//BinaryFormatter bs = new BinaryFormatter();
//bs.Serialize(ms, ProfileData.GetType());
//return System.Text.Encoding.ASCII.GetString(ms.ToArray()) ;

XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
seri.Serialize(ms, ProfileData);

return data;
}
finally { if (ms != null)ms.Dispose(); }
}

این تابع مشکل داره:
public void LoadDataSerialized(string data)
{
byte[] byt = System.Text.Encoding.ASCII.GetBytes(data);

MemoryStream ms = new MemoryStream();
ms.Write(byt, 0, data.Length);
ms.Seek(0, SeekOrigin.Begin);


// ---- Binary methood for Deserialize, But error every Time
//BinaryFormatter bs = new BinaryFormatter();
//this.ProfileData = (ProfileStructure)bs.Deserialize(ms); // ---- error

// ---- other methood for Deserialize, but error just field type is Class
XmlSerializer seri = new XmlSerializer(ProfileData.GetType());
this.ProfileData = (ProfileStructure)seri.Deserialize(ms);
}
}

// ----------------------------------------------

public interface IProfile<T>
{
// Get data Serialized for save in database
string GetDataSerialized();

// read from database and load by this methood
void LoadDataSerialized(string data);

T ProfileData { set; get; }
}

// Profile Structure
public class ProfileStructure
{
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public string Theme { get; set; }
public string PostalCode { get; set; }
public string NationalCode { get; set; }
public string Address { get; set; }
public IBasketUser Basket { get; set; }
}

// ----------------------------------------------

// Basket Structure
public interface IBasketUser
{
void AddItem(int ID_Part, int Count_Part);
void DeleteItem(int ID_Part);
Dictionary<int, int> GetListProduct { set; get; }
}

public class BasketUser : IBasketUser
{
public BasketUser()
{
GetListProduct = new Dictionary<int, int>();
}

public void AddItem(int ID_Part, int Count_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct[ID_Part] = Count_Part;
else
GetListProduct.Add(ID_Part, Count_Part);

}
public void DeleteItem(int ID_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct.Remove(ID_Part);
}
public Dictionary<int, int> GetListProduct
{
get; set;
}

}


استفاده ی از قسمت بالا:




Profile pf = new Profile();
pf.ProfileData.Name = "Hossein";
pf.ProfileData.Family = "Tavasoli";
pf.ProfileData.Tell = "6535358";
pf.ProfileData.Address = "Iran";

pf.ProfileData.Basket = new BasketUser();
pf.ProfileData.Basket.AddItem(1, 1);
pf.ProfileData.Basket.AddItem(6, 3);

string data = pf.GetDataSerialized();

pf.LoadDataSerialized(data);




آقا این کدی که نوشتمو خودم بالاخره مشکلشو پیدا کردم, واسه همین پاکش نکردم که بقیه اشتباره منو نکنن:
خب اولین اشتباهم این بود که کلاس هایی که میخاستم سریالی بشه را, خاصیت [serialized] نذاشتم, توجه کنید واسه کلاس BasketUser نذاشتم.
دومین اشتباه موقع DeSerializ کردن بود که من به روش CastingType عمل می کردم که اشتباده بود و واسه همین خطا می داد. تو یه سایت از روش زیر استفاده کرده بود.



MyClass c = DeSrialized(myStrim) as MyClass;


همین!!!!!!!!!!!!:عصبانی++:

اینم کد نهایی که هر کسی مثل من کار کنه داشته باشه:


ساختار کلاس ها:



public class Profile : IProfile<ProfileStructure>
{
public ProfileStructure ProfileData { get; set; }

public Profile()
{
ProfileData = new ProfileStructure();
}

public byte[] GetDataSerialized()
{
MemoryStream ms = null;
try
{
ms = new MemoryStream();

BinaryFormatter bs = new BinaryFormatter();
bs.Serialize(ms, ProfileData);

return ms.ToArray();
}
finally { if (ms != null)ms.Dispose(); }
}

public void LoadDataSerialized(byte[] data)
{
if (data == null)
throw new Exception("the data serialized is empty.");

MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length);

// for next line get error, becuase 'posion indicator stream' when ms.Write(...) move to last posion
// of stram, and opration of 'bs.Deserialize(ms)', need the 'indicator stream' move first strem.
ms.Seek(0, SeekOrigin.Begin);

BinaryFormatter bs = new BinaryFormatter();

ProfileStructure prof = bs.Deserialize(ms) as ProfileStructure;

if (prof == null)
throw new Exception("the Desrialized not Successful.");
else
this.ProfileData = prof;
}
}

// ----------------------------------------------

public interface IProfile<T>
{
// Get data Serialized for save in database
byte[] GetDataSerialized();

// read from database and load by this methood
void LoadDataSerialized(byte[] data);

T ProfileData { get; }
}

// Profile Structure
[Serializable]
public class ProfileStructure
{
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public string Theme { get; set; }
public string PostalCode { get; set; }
public string NationalCode { get; set; }
public string Address { get; set; }
public IBasketUser Basket { get; set; }
}

// ----------------------------------------------

// Basket Structure
public interface IBasketUser
{
void AddItem(int ID_Part, int Count_Part);
void DeleteItem(int ID_Part);
Dictionary<int, int> GetListProduct { get; }
}

[Serializable]
public class BasketUser : IBasketUser
{
public BasketUser()
{
GetListProduct = new Dictionary<int, int>();
}

public void AddItem(int ID_Part, int Count_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct[ID_Part] = Count_Part;
else
GetListProduct.Add(ID_Part, Count_Part);

}
public void DeleteItem(int ID_Part)
{
if (GetListProduct.ContainsKey(ID_Part))
GetListProduct.Remove(ID_Part);
}
public Dictionary<int, int> GetListProduct
{
get;
set;
}
}







استفاده از ساختار:



Profile pf = new Profile();
pf.ProfileData.Name = "Hossein";
pf.ProfileData.Family = "Tavasoli";
pf.ProfileData.Tell = "6535358";
pf.ProfileData.Address = "Iran";

pf.ProfileData.Basket = new BasketUser();
pf.ProfileData.Basket.AddItem(1, 1);
pf.ProfileData.Basket.AddItem(6, 3);

byte[] data = pf.GetDataSerialized();

pf.ProfileData.Basket = null;
pf.ProfileData.Name = "reza";

pf.LoadDataSerialized(data);




دوستان اگه بدردتون خورد تشکرو بزنین دیگه! :لبخند:

با تشکر

علیرضا حسن زاده
شنبه 03 مهر 1389, 07:42 صبح
یه روش مناسب و بهتر هم برای این کار وجود داره اونم استفاده از XML هست ذخیره سازی اون راحت تره و قابلیت انعطاف پذیری زیادی هم نسبت به ذخیره سازی کلاس داره.
کامپوننت های دات نت هم که برای کار با داده هستن می تونن خیلی راحت باهاش کار کنن
این همه هم مشکلات تبدیل و ذخیره سازی و ... نداره. برای امنیت داده ها هم خیلی راحت می تونید اونها رو کد کنید

HDDSoft2001
شنبه 03 مهر 1389, 18:54 عصر
با سلام
علت اینکه از این روش استفاده کردم به جای xml به خاطر سرعت بالای آن موقع ذخیره و بازیابی و همین طور حجم داده ها بود. و مهمتر از آنها کد کذاری بود. خلاصه کار من که راه افتاد!!! ولی اگه شما نظر بهتری دارید که فکر می کنید از این روش خیلی بهتره لطفا دقیق تر توضیح بدید! بازم ممنون به خاطر توجهتون.

با تشکر