Stream and serializable סטרימינג וסריאליזציה למתחילים

24 בMarch 2013

תגיות: ,
אין תגובות

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

אז מה זה סטרימינג?
בד”כ נכיר את המושג מסטרימרים של מדיה ביתית(לא שמעתם על זה? תתקדמו..)

 בכל זאת ההבדל בין שמירת משתנה מקומי שנעלם בעת
סגירת האפליקציה לבין שמירה ב
Data-Base לא חייב
להיות שחור ולבן ואפשר להכניס כמה גווני אפור באמצע.

שמירה לקובץ זאת דרך
נהדרת לשמור בקלות נתונים, קונפיגורציות, קאש וכל מיני דברים גם אם לצרכי בדיקות
בלבד. 
Stream  זאת הטכנולוגיה שיודעת לקחת נתונים ול”שפוך” אותם לאיזשהו
קובץ.

ברמה הבסיסית נסביר
את זה כך:
Stream  עובד
ע”כ שהוא מקבל מערך של בתים וממיר אותו לטקסט. אז אם יש לנו טקסט  ונרצה לשמור אותו דבר ראשון נבצע עליו המרה למערך של בתים..

כדי לקחת טקסט ולהמיר
אותו למערך של בתים יש כל מיני שיטות, אני מציג כאן את האובייקט מערכת
Encoding שכולל כמה אופציות נחמדות, ובסופו של דבר אני מקבל מערך שניתן
לשלוח לסטרימר:

 static void Main(string[] args)

       {

           Console.WriteLine(“enter Data”);

           string res = Console.ReadLine();

 

           byte[] dataWriter = Encoding.Unicode.GetBytes(res);

 

           try

           {

             FileStream MyFile = new FileStream(“tst01”FileMode.Create);

               MyFile.Write(dataWriter, 0, dataWriter.Length);

               MyFile.Dispose();

           }

           catch (Exception ex)

           {

               Console.WriteLine(ex.Data);

           }

 

בנקודה הזאת קיבלתי
קובץ נתונים, שנוצר באופן דיפולטיבי בתיקיה המקומית של הפרויקט. באותה צורה אני
קורא מהקובץ ומקבל בחזרה מחרוזת טרסט לידיים:

 FileStream stream = new FileStream("tst01"FileMode.Open);
            byte[] datareader = new byte[stream.Length];
            
            try
            {
                stream.Read(datareader, 0, datareader.Length);
                string resault = Encoding.Unicode.GetString(datareader);
            }
 
            catch (Exception ex)
            {
                Console.WriteLine(ex.Data);
            }

אוקיי, זה טוב ונחמד
כשיש לי טקסט מה אם יש לי אובייקט? מערך של אובייקטים ואני רוצה לכתוב אותם כגיבוי
לזיכרון בלי לעבוד קשה?

  נותן לי יכולת נפלאה להמיר אובייקטים ישירות
לזיכרון בפורמטים שונים  
 Attribute Serializable      שימוש ב

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

 נניח שיש לי רשימה כזאת:

 private List<Person> data;
        public serializationTest()
        {
            data = new List<Person>()
                {
                    new Person() {Name = "R"},
                    new Person() {Name = "R2"},
                    new Person() {Name = "R3"}
                };
        }

הפונקציה הבאה מבצעת
את הכתיבה לקובץ:

 public void serialize()
 {
  XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
  using (StreamWriter streamWriter = System.IO.File.CreateText("data.txt"))
         {
           serializer.Serialize(streamWriter, data);
         }
 }

 והפעולה ההפוכה מתבצעת כך:

 public List<Person> deserialze()
   {
       List<Person> data;
       XmlSerializer serializer = new XmlSerializer(typeof(List<Person>));
         using (TextReader reader = new StreamReader("data.txt"))
         {
             var ReaderData = serializer.Deserialize(reader);
             data = ReaderData as List<Person>;
         }
         return data;
     }
 

חשוב להבין
שסריליזציה זה לא מעשה קסם אם נשים לב אז תמיד נכנס הקטע של טיפוס בהגדרת
הסריליזציה

זה אומר שישנה עבודת
רפלקשן מאחורי הקלעים וצריך להיות מודעים לכך, כמו כן אין לנו שליטה מדוייקת על
פתיחת/ סגירת קבצים ונשתמש תמיד ב:

Try catch + Dispose

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *