PDA

View Full Version : مشکل در Serialize کردن



azarin62
یک شنبه 23 دی 1386, 17:02 عصر
سلام
من یک کلاس دارم که باید Serialize بشه .
بعضی Property های این کلاس از نوع کلاسهایی هستند که Attribute سریالیز [Serialize] براش تعریف نشده و بنابراین قابل Serialize شدن نیست

کدی که برای سریالیز استفاده کردم به صورت زیره


publicstaticvoid Save(ModuleInformation moduleInformation, string fileName)
{
try
{
IFormatter formatter = newBinaryFormatter();

using (Stream fileStream = File.Open(fileName, FileMode.Create))
{
formatter.Serialize(fileStream, moduleInformation);
}
}
catch (Exception error)
{
thrownewException("ModuleInformation.Save : " + error.Message);
}
}


برای سریالیز کردن این کلاس ها چه باید کرد

sinpin
یک شنبه 23 دی 1386, 17:27 عصر
سلام
من یک کلاس دارم که باید Serialize بشه .
بعضی Property های این کلاس از نوع کلاسهایی هستند که Attribute سریالیز [Serialize] براش تعریف نشده و بنابراین قابل Serialize شدن نیست
چرا از shallow serialization استفاده نمیکنید؟
با XmlSerializer (البته بجز اعضای خصوصی)

Private variables and properties are all serialized. In binary serialization, both the private variables and properties are serialized. This is known as deep serialization, as opposed to shallow serialization in XML serialization (which only serializes the public variables and properties)

azarin62
یک شنبه 23 دی 1386, 17:42 عصر
من از این روش استفاده کردم چون تعداد کلاسهایی که تو پروژه استفاده کردم زیاد بود
اگه بخوام از XmlSerializerاستفاده کنم باید برم تو تک تک کلاسهام تعریف کنم که کدوم Property سریالیز بشه و کدوم نشه
[System.Xml.Serialization.XmlIgnoreAttribute]


اما کلاسهایی که من الان مشکل دارن 7 تا هستن
راه حل بهتری نداری

حامد مصافی
یک شنبه 23 دی 1386, 19:26 عصر
صفت [Serialize] برای کل کلاس تعریف شده؟
با کد مندرج مشکل دارید ؟

سوالتون کمی ناقصه !

azarin62
یک شنبه 23 دی 1386, 23:11 عصر
من با کد مشکلی ندارم
مشکل من این بود که کلاسی که سریالیز نمی شد را سریالیز کنم که حل شد

تنها کلاسهایی سریالیز می شن که صفت [Serializable] داشته باشند
و از اینترفیس System.Runtime.Serialization.ISerializable ارث ببرند

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

یک کلاس تعریف کنیم که از کلاس مورد نظر و System.Runtime.Serialization.ISerializable ارث ببرد
و متد GetObjectData از اینترفیس System.Runtime.Serialization.ISerializable را پیاده سازی کنیم.
مانند کد زیر


publicclass MyTableLayoutPanel : TableLayoutPanel, System.Runtime.Serialization.ISerializable
{
//در این قسمت یک سازنده ایجاد می کنیم که پارامترهای زیر را دارد
//هنگام دی سریالیز کردن این سازنده صدا زده میشود
protected MyTableLayoutPanel(System.Runtime.Serialization.Se rializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
if (info == null)
thrownew System.ArgumentNullException("info is null");
//خصوصیت های را که می خواهیم از حالت سریالیز شده بخوانیم و به آبجکت تبدیل کنیم
this.BackColor = (Color)info.GetValue("BackColor", typeof(Color));
}
// در این متد خصوصیاتی را که می خواهیم سریالیز کنیم را مشخص می کنیم
//هنگام سریالیز کردن این متد صدا زده می شود
publicvoid GetObjectData(System.Runtime.Serialization.Seriali zationInfo info, System.Runtime.Serialization.StreamingContext context)
{
info.SetType(typeof(MyTableLayoutPanel));
//خصوصیاتی که باید سریالیز شوند
info.AddValue("BackColor", this.BackColor);
}
}