Serialization #2
نویسنده: سیدمجتبی حسینی
تاریخ: ۱۳۹۱/۰۷/۱۵ ۲۳:۱۷
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
مطابق آنچه در قسمت قبل گفته شد برای آنکه بتوان از مدل News برای سریالیکردن استفاده کرد، باید آن را به شکل ذیل پیادهسازی کرد:
[DataContract]
public class News
{
[DataMember] public int Id;
[DataMember] public string Body;
[DataMember] public DateTime NewsDate;
}
با Override کردن [DataContract]به صورت [("DataContract(Name=”MyCustomNews] میتوان نام ریشه XML فایل را به MyCustomNews تغییر داد. همچنین با Override کردن [DataMember] بصورت [("DataMember(Name=”MyCustomFieldName] میشود به هر فیلدی عنوان دلخواهی داد و همچنین با تعیین عبارت NameSpace به صورت [("DataContract(Name = "MyCustomNews", Namespace = "http://www.my.com] میشود فضای نام را تغییر داد که با این تغییرات، خروجی زیر حاصل میشود:
<?xml version="1.0" encoding="utf-8"?> <MyCustomNews xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.my.com"> <Body>NewsBody</Body> <MyCustomFieldName>111</MyCustomFieldName> <NewsDate>2012-10-04T00:00:00</NewsDate> </MyCustomNews>
ویژگی [DataMember] هم ازفیلدها و هم از propertyها، پشتیبانی میکند، خواه عمومی باشند یا خصوصی و نوع فیلد یا Property میتواند به یکی از اشکال زیر باشد:
تعیین فرمت باینری برای سریالیکردن:
برای سریالی کنندههای DataContractSerializer و NetDataContractSerializer میتوان به روش زیر فرمت خروجی را به شکل فرمت باینری درآورد که خروجی آن تاحد زیادی کوچکتر و کم حجمتر میشود:
var s = new MemoryStream();
using (XmlDictionaryWriter w=XmlDictionaryWriter.CreateBinaryWriter(s))
{
ds.WriteObject(w,news);
}
و برای Deserialize کردن آن به شیوه زیر عمل میکنیم:
var s2 = new MemoryStream(s.ToArray());
News deserializednews;
using (XmlDictionaryReader r=XmlDictionaryReader.CreateBinaryReader(s2,XmlDictionaryReaderQuotas.Max))
{
deserializednews = (News)ds.ReadObject(r);
}
که در آن از ویژگی Max کلاس XmlDictionaryReaderQuotas برای به دست آوردن حداکثر سهمیه فضای دیسک مربوط به XmlDictionaryReaders استفاده میشود.