معرفی Serializer در Net.

یکشنبه 18 مرداد 1394

در این مقاله می خواهیم با فرایند Serialization و de-serialization آشنا شویم و چندین Serializer را از جهت سرعت و طول رشته تولیدشده مقایسه کنیم.

معرفی Serializer در Net.

هر سیستم توزیع شده ای برای انتقال داده از طریق سیم، نیاز به سریال سازی (serializing) دارد. Serializerها برای پنهان شدن در adapterها و Proxyها استفاده می شوند، تا برنامه نویس به طور مستقیم با فرایند سریال سازی سر و کار نداشته باشد. WCF سریال سازی مثال مناسبی، برای زمانی است که نیاز داریم بدانیم صفات Serializable را کجا قرار دهیم. در توسعه Windows .Net، این کار باید زمانی انجام شود که Json.Net serializer توسط James Newton-King ساخته شود و حتی مایکروسافت آن را به طور رسمی serializer پیشنهادی برای Net. اعلام کرده است.

Serialization، فرایند تبدیل یک شی به جریانی از داده است که می تواند به راحتی روی شبکه منتقل شود و باید به فرمتی باشد که در دو طرف کانال ارتباط، قابل فهم باشد. serialization توسط Remoting و SOAP برای انتقال داده بین سرور و کلاینت استفاده می شود. deserialization ایجاد دوباره همان شیء در طرف دیگر ارتباط است.

Serializerهای بسیاری وجود دارند که داده های فشرده را بسیار سریع تولید می کنند. Serializer هایی برای ارسال پیام، ذخیره داده ها و ... وجود دارند.

برترین Serializer در Net. چیست؟

این مقاله درباره بهترین serializer نیست. در این مقاله، کدهایی در چندین خط جمع آوری کرده ایم، که نشان می دهد چگونه از serializerهای مختلف در Net. استفاده کنیم. تنها این کدها را در پروژه خود Copy-Paste کنید. می خواهیم Serializerها را با ساده ترین روش استفاده کنیم اما خوب است که بدانید، اگر کارآیی برنامه شما بالا رفت، به دلیل استفاده از اندازه گیری های اضافه ای است که به آن افزودیم.

لطفا این اندازه گیری ها را خیلی جدی نگیرید. ما یک سری عدد داریم، اما این پروژه، مثال مناسبی برای تصمیم گیری درباره کارآیی srializer ها نیست. چرا که در این مقاله، زمان زیادی برای گرفتن بهترین نتیجه صرف نشده است، اگر در این زمینه تخصص دارید، با تغییر دادن کد به اعداد قابل اعتمادتری برسید.

مرحله نصب:

اغلب serializer ها، با استفاده از NuGet package نصب می شوند. فایل “packages.config” را مشاهده کنید تا نام package را بیابید. توضیحاتی در قالب کامنت کنار کد، برای آن گذاشته ایم.

تست ها:

داده های تست به طور تصادفی با Randomizer ساخته شده است که فیلدهای شیء person را با تولید داده های تصادفی پر می کند. این شیء برای یک دور تست همه Serializerها استفاده می شود و سپس برای دور بعدی، دوباره تولید می شود. اگر می خواهید، تست Serializerها را برای سایزهای مختلف شی و یا انواع مختلف داده استفاده کنید، شیء person را تغییر دهید.

زمان اندازه گیری شده، برای Serialization و عملیات deserialization یک پروژه می باشد. زمانی که Serializer برای اولین بار فراخوانی می شود، زمان بیشتری نسبت به دفعات بعدی طول می کشد تا اجرا شود. این زمان طولانی نیز مهم است و محاسبه می شود و به آن Max time می گوییم. اگر تنها به یک serialization/deserialization نیاز داشته باشیم، این مقدار برای ما بسیار قابل توجه می باشد. اگر ما این کار را به دفعات زیادی تکرار کنیم، مقداری که برای ما اهمیت دارد Average time و Min time خواهد بود.

برای Average time، سه مقدار زیر را محاسبه می کنیم:

برای Average 100%، تمام دفعات اندازه گیری شده استفاده می شوند.

برای Average 90%، میزان 5% از کندترین و 5% از سریعترین نتایج نادیده گرفته می شوند.

برای Average 80%، میزان 10% از کندترین و 10% از سریعترین نتایج نادیده گرفته می شوند.

اگر اختلاف قابل توجهی بین میانگین 80% و 90% را مشاهده کنیم، باید تعداد تست ها را برای رسیدن به نتیجه پایدار و درست تر افزایش دهیم.

همچنین، ما دو نتیجه تست با تعداد تکرار متفاوت آماده کرده ایم، تا مطمئن باشیم نتایج تست پایدار و قابل اطمینان هستند.

بعضی serializerها، خروجی را به رشته serialize می کنند و بقیه تنها به یک byte array. در اینجا، از فرمت base64 برای تبدیل byte array به رشته استفاده کرده ایم. UTF-8 هم می تواند فرمت فشرده ای باشد.

نتایج تست:

نتایج تست، که در شکل زیر نشان داده شده است برای 100 و 200 تکرار انجام شده است.

resault100

 

برنده این رقابت... ProtoBuf نیست اما NetSerializer بهترین نتیجه را ارائه می دهد. Jil و MsgPack نیز، سرعت و رشته های فشرده شده قابل قبولی را نشان می دهند.

نکات:

- Serializer کلاسیک Json.Net، در هر دو حالت Helper و Stream استفاده شده اند. تست ها تفاوت استفاده از Streams و serializer کلاس های Helper را نشان می دهد. کلاس های Helper می توانند، کارآیی را به شدت کاهش دهند. بنابراین، Streamها می توانند بهترین روش برای حفظ سرعت و بدون هزینه و زحمت زیاد باشند.

- اولین فراخوانی Serializer، آن را مقداردهی اولیه می کند و به همین دلیل فراخوانی بعدی، هزار بار سریعتر می باشد.

- برای Microsoft Avro، متد قابل سریال سازی مناسبی نیافتیم، اما اندازه رشته های Serialize شده با آن مناسب است. bug هایی دارد که از ارسال داده های Serialize شده به کلاس جلوگیری می کند.

- Json و binary Formats در اندازه رشته های Serialize شده، تفاوت چندانی ندارند.

- بسیاری از Serializerها با فرمت های Json DateTime به خوبی کار نمی کنند. تنها NetSerializer و Json.Net به خوبی با آن کار می کنند.

- serializerهای مایکروسافت: XmlSerializer ،BinarySerializer ،DataContractSerializer، DataContractSerializer عملکرد نسبتا خوبی داشتند. سرعت آنها خوب بود اما اندازه رشته تولید شده چندان رضایت بخش نیست. JavaScriptSerializer رشته های فشرده تولید می کند، اما سرعت آن مناسب نیست.

- DataContractJsonSerializer بسیار فشرده تر از DataContractSerializer می باشد.

- NetDataContractSerializer، BinarySerializer و Json.Net درمقایسه با بقیه Max time کمتری داشتند. بنابراین می توان نتیجه گرفت، زمانی که تنها یک دور serialization/deserializaton داشته باشیم، انتخاب های بهینه ای هستند.

 

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید