אחד התכונות(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