ABA


"מאמר קצרצר ומהיר בנושא Serialization ב- NET."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15025 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15025
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   16:26   29.10.08   
אל הפורום  
  מאמר קצרצר ומהיר בנושא Serialization ב- NET.  
 
   אחד התכונות(Attributes) המגניבות שNET. מאפשרת לשים על מחלקות, לפי דעתי, זה ה [Serializable].
אז מה זה Serialization? זה בעצם האפשרות להמיר אובייקטים מורכבים(נניח מחלקות) לתוך מבנה של Stream כלשהו: בינארי, SOAP, XML וכו'. אני אתן דוגמה.

נניח ויש לנו מחלקת UserPrefs שנראית ככה:


class UserPrefs
{
enum Color { Black, White };

private Color _textColor = Color.Black;
private Color _bgColor = Color.White;
private string _userName = "Sn00py";

public string UserName
{
get { return _userName; }
}
// ...
}


אנחנו רוצים כמובן לשמור את ה UserPrefs. יש לנו כמה אופציות:
* לבנות פארסר שיתרגם את המידע לטקסט ויכניס אותו לקובץ כלשהו בצורה טקסטואלית.
* להכניס לרג'יסטרי.
* וכו' וכו'

האופציה העדיפה מבחינתי היא לשמור את ההעדפות כקובץ בינארי - user.dat לדוגמה.
לשם כך יש את האופציה של ה Serialize - האופציה להמיר את המחלקה ואת המאפיינים שלה לתוך קובץ בינארי בצורה פשוטה ונוחה.

בשביל לאפשר למחלקה להיות מומרת, יש לתחום אותה בתכונה [Serializable].


[Serializable]
class UserPrefs
{
enum Color { Black, White };

private Color _textColor = Color.Black;
private Color _bgColor = Color.White;
private string _userName = "Sn00py";

public string UserName
{
get { return _userName; }
}
// ...
}

בשביל להמיר אחר כך את הקובץ לקובץ בינארי, או במילים אחרות, לעשות את תהליך הסריאליזציה, ישנם אובייקטים שעוזרים לנו ומאפשרים לנו להמיר ל
SOAP, XML ופורמט בינארי. אנחנו נתעסק כרגע בפורמט בינארי, באמצעות המחלקה BinarryFormatter. דוגמת קוד:


BinaryFormatter bf = new BinaryFormatter();
UserPrefs up = new UserPrefs();


using (FileStream fs = new FileStream("user.dat",FileMode.Create, FileAccess.Write,FileShare.None))
{
bf.Serialize(fs, up);
}

כמובן שבשביל לעשות את התהליך ההפוך, ישנה פונקצית DeSerialize, דוגמת קוד:


using (Stream fStream = File.OpenRead("user.dat"))
{
Something st = (UserPrefs)bf.Deserialize(fStream);
}

לא לשכוח כמובן להוסיף משפטי Try Catch רלוונטים

ועכשיו הדגמה: כתבתי את התכנית הבאה:


using System;
using System.Collections;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication24
{
[Serializable]
class UserPrefs
{
enum Color { Black, White };

private Color _textColor = Color.Black;
private Color _bgColor = Color.White;
private string _userName = "Sn00py";

public string UserName
{
get { return _userName; }
}
// ...
}

class Class2
{
public static void Main()
{
BinaryFormatter bf = new BinaryFormatter();
UserPrefs up = new UserPrefs();

Console.WriteLine("--> Current UserPrefs Username is: {0}", up.UserName);
Console.WriteLine();
Console.WriteLine("--> Serializing UserPrefs Class...");
using (FileStream fs = new FileStream("user.dat",FileMode.Create, FileAccess.Write,FileShare.None))
{
bf.Serialize(fs, up);
}

Console.ReadLine();

Console.WriteLine("--> Deserializing UserPrefs Class...");
using (Stream fStream = File.OpenRead("user.dat"))
{
UserPrefs upTest = (UserPrefs)bf.Deserialize(fStream);
Console.WriteLine(upTest.UserName.ToString());
}
}
}
}

התכנית מבוססת על הקוד מהקטעים הקודמים במאמרון. מה שקורה כאן זה שבעצם
אני יוצר מחלקה בסיסית, עושה לה סריאליזציה לתוך קובץ user.dat, עושה 'הפסקה'
בכך שאני 'מחכה' לאנטר מהמשתמש, ואז ממשיך. ההפסקה תשמש אותנו לשינוי הערך
של אחד המשתנים של המחלקה מחוץ לקומפיילר על מנת להדגים
את הטעינה מחדש של הערכים.

נריץ את התכנית:

וכעת - נראה שנוצר לנו קובץ user.dat בתיקית ההרצה של התכנית. ננסה לפתוח אותו עם כל עורך HEX רגיל(שהרי זה קובץ בינארי ולא קובץ טקסט!) ונקבל את החלון הבא:

שימו לב שהדגשתי את החלק שמעניין אותנו. בעצם אפשר לראות שכל המחלקה נכנסה לקובץ הבינארי הנ"ל, אך בצד ימין אפשר לראות את ה'פירוש' להקסה(ובשביל זה משתמשים ב HEX EDITOR כלשהו), ואפשר לראות בברור שהערך שהיה במתשתנה username נכנס לקובץ. עכשיו נעשה ניסוי קטן, ננסה באמצעות ה HEX EDITOR לשנות את הערך(כל הזמן הזה, התוכנה רצה ברקע ומחכה ללחיצת אנטר בשביל להמשיך ולעשות דה-סריאלזציה):

ועכשיו, נשמור ונחזור לתכנית שלנו ונלחץ אנטר. התכנית תקרא את הנתונים מהקובץ ותכניס את הנתונים למפוע חדש של המחלקה, והפלא ופלא! למרות שבקוד המקור כתוב Sn00py, אחרי שערכנו בקובץ, עכשיו כתוב Yochai!():

כמובן שיש הרבה שימושים לסריאליזציה, הצגתי רק אחד... ומקווה שכולכם למדתם משהו חדש

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תאכלס זה מגניב רצח במיוחד בPHP:} akoka 29.10.08 16:29 1
  מעניין מאוד! האמת היא שאני מכיר את זה גם מתחום העבודה ldan192  29.10.08 18:01 2
     זמן אמת לא!(למרות שזה אפשרי) Sn00py  29.10.08 18:28 3
         כן :) לזה אני מתכוון ldan192  30.10.08 11:11 4
  יפה מאוד, תודה רבה!!! סרן נזרוב 30.10.08 19:12 5
  כל הכבוד לירן :) הצל''ש בדרך ! Net_Boy  30.10.08 20:29 6
  לא הבנתי כלום אבל תודה :) nsigns 30.10.08 20:43 7
  תודה יא סוס =] ronen333  01.11.08 00:07 8
     אממ.. lior066 05.11.08 03:51 10
         אחלה הבנתי.. תודה רבה על ההסבר =] ronen333  05.11.08 14:41 11
  יפה, אהבתי את השימוש... Static 01.11.08 21:00 9

       
akoka

   16:29   29.10.08   
אל הפורום  
  1. תאכלס זה מגניב רצח במיוחד בPHP:}  
בתגובה להודעה מספר 0
 
   תודה אליל.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:01   29.10.08   
אל הפורום  
  2. מעניין מאוד! האמת היא שאני מכיר את זה גם מתחום העבודה  
בתגובה להודעה מספר 0
 
עם זכרון (Memory editors) וגם מתחום עריכת פאקטי תעבורה (Packet Shapers?) - אבל על עריכת קובץ טקסט שמשנה בו זמנית נתונים זמן אמת בזכרון התוכנית לא שמעתי. יפה! מעניין תודה


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   18:28   29.10.08   
אל הפורום  
  3. זמן אמת לא!(למרות שזה אפשרי)  
בתגובה להודעה מספר 2
 
   הכוונה הייתה פשוט טעינת קובץ הגדרות. שים לב לקוד
למרות שגם בזמן אמת אפשר לעשות BACKGROUND THREAD שבודק שינויים כמובן, לא בעיה.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:11   30.10.08   
אל הפורום  
  4. כן :) לזה אני מתכוון  
בתגובה להודעה מספר 3
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
סרן נזרוב

   19:12   30.10.08   
אל הפורום  
  5. יפה מאוד, תודה רבה!!!  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   20:29   30.10.08   
אל הפורום  
  6. כל הכבוד לירן :) הצל''ש בדרך !  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
nsigns

   20:43   30.10.08   
אל הפורום  
  7. לא הבנתי כלום אבל תודה :)  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 30.10.08 בשעה 20:43 בברכה, nsigns
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   00:07   01.11.08   
אל הפורום  
  8. תודה יא סוס =]  
בתגובה להודעה מספר 0
 
   תוכל רק להסביר בשביל מתי בדיוק אני אצתרך דבר כזה? XD


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
lior066

   03:51   05.11.08   
אל הפורום  
  10. אממ..  
בתגובה להודעה מספר 8
 
   בתור בונה אתרים אני יפנה אליך כי אני ודע שאתה מתעסק בזה..

נגיד ובא לך לשמור פרופלים של משתמש על קובץ כדי לחסוך לעצמך מקום ב DB ולמנוע קריאות שלא יהיה עומס ולהשתמש בשרת , אז מה שאתה עושה אתה יכול לבנות לך מחלקה של פרופיל משתמש , עם כל הפרטים עליו , ( שם פרטי , משפחה טלפון , מייל וכדומה )
ואז אתה יכול לשמור אותו בתוך קובץ XML לדוגמא ולהשים את כל הפרופלים שלך לפי שם משתמש בתיקיה שנקראת PROFILES ואז אתה יכול לחסוך מקום במסד נתונים.

השימוש העיקרי פה הוא בעיקר לפיתוח תוכנות חלוניות כיוון שרוב התוכנות לא משתמשות ב DB לכל מטרה , ויש צורך גם בהמרה של והעברה של נתונים בין תוכנית אחת לשניה ושמירה על המסד נתונים פרטית לתוכנית עצמה , כמו נניח ואתה רוצה לבנות לך תוכניות שתחשב לך מס , מע"מ וכל זה לראית חשבון אז אתה יכול לשמור את כל הנתונים של אותו עסק שאתה רוצה בתיקיה בתור קובץ ואחרי זה נגיד יש מסוף אחר אתה יכול להעביר לו את הנתונים ספציפי רק של אותו לקוח דרך הקובץ ששמרת, או שאם תבנה בעתיד עוד תוכנה שתעבוד עם קבצים של אותו תוכנה אחרת לדוגמא שמכינה גרפים או משהו של אותו לקוח אתה יכול פשוט להכניס את הקובץ וואלה , הכל מופיע לך בלי תלות במשהו אחר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:41   05.11.08   
אל הפורום  
  11. אחלה הבנתי.. תודה רבה על ההסבר =]  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   21:00   01.11.08   
אל הפורום  
  9. יפה, אהבתי את השימוש...  
בתגובה להודעה מספר 0
 
   הפעם היחידה שעשיתי שימוש בסיראליזציה היתה כאשר הייתי צריך לעשות SAVE \ LOAD באיזה משחק שכתבתי..

בכל מקרה מאמר קצר וענייני.. לי הוא עזר!, תודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net