דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. serilization לכל התוכנה

serilization לכל התוכנה

מתוזמן נעוץ נעול הועבר ארכיון code613m
31 פוסטים 4 כותבים 1.9k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #21

    נכון. טעות שלי.
    אפשר לעשות ref וout, ואז זה יעבוד.
    אבל הכי טוב זה המתודה החליפית שכתבתי אח"כ.

    פורסם במקור בפורום CODE613 ב31/07/2015 10:18 (+03:00)

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    1
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #22

      @avr416

      הבעיה עם זה שאם יש לי מחלקות שיורשות ממחלקות אחרות בתכנית זה לא יועיל, כי אפשר לרשת רק ממחלקה אחת.

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

      פורסם במקור בפורום CODE613 ב31/07/2015 11:18 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #23

        רחמים לא התכוון במחלקות שלך, אלא במקום מחלקת הList תירש הימנה (או מObservablECollection שזה ליסט שנותן נוטיפקציה לשינויים שזה מאוד שימושי בWPF).
        @avr416

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

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

        פורסם במקור בפורום CODE613 ב31/07/2015 11:39 (+03:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • A מנותק
          A מנותק
          avr416
          כתב ב נערך לאחרונה על ידי
          #24

          @דוד ל.ט.

          אם זה לא קשה (זה כן) אז תגיד לי בדיוק איפה השגיאה ומה והאם היא בזמן כתיבה - קומפילציה, או זמן ריצה.

          דווקא לא קשה כי השגיאה בזמן כתיבה.
          הודעת השגיאה היא:
          (?Cannot implicitly convert type 'object' to 'T'. An explicit conversion exists (are you missing a cast

          פורסם במקור בפורום CODE613 ב31/07/2015 16:21 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • A מנותק
            A מנותק
            avr416
            כתב ב נערך לאחרונה על ידי
            #25

            @רחמים

            בשביל לקצר את הקוד והמורכבות הייתי עושה כך
            יוצר מחלקה אבסטרקטית היורשת מליסט או ObservableCollection
            מחלקה זו תטפל בכל הנושא של קריאה וכתיבה מהדיסק
            וכל הליסטים האחרים של התרומות ותורמים וכו' ירשו ממחלקה אבסטרקטית הנ"ל וכך כל דבר יהיה כתוב רק פעם אחת.
            כשתרצה להוסיף ליסט חדש לתוכנה כל שעליך לעשות זה להצהיר שהוא יורש מהמחלקה הנ"ל ולהמציא נתיב שמירה.

            עכשיו אני רואה שלא הבנתי את דבריך 😢
            אתה מתכוון שאצור מח' שמטפלת בשמירה ופתיחה והיא תירש ממח' הליסט ודומיה, ואח"כ המח' הראשונה בתכנית תירש ממנה, ונמצא שכל המח' שיורשות מאותה מח' יוכלו לממש את הפונקציות שנמצאות במח' הטיפול בקבצים.
            אבל למה זה מקצר את הקוד והמורכבות לא כ"כ הבנתי..
            תודה רבה ושבת שלום!!

            פורסם במקור בפורום CODE613 ב31/07/2015 16:39 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #26

              @avr416

              ונמצא שכל המח' שיורשות מאותה מח' יוכלו לממש את הפונקציות שנמצאות במח' הטיפול בקבצים.

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

              פורסם במקור בפורום CODE613 ב31/07/2015 17:22 (+03:00)

              תגובה 1 תגובה אחרונה
              2
              • A מנותק
                A מנותק
                avr416
                כתב ב נערך לאחרונה על ידי
                #27

                @רחמים

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

                צודק!! התכוונתי להשתמש..
                התבלבלתי במונח :lol: :lol:

                פורסם במקור בפורום CODE613 ב01/08/2015 23:20 (+03:00)

                תגובה 1 תגובה אחרונה
                0
                • A מנותק
                  A מנותק
                  avr416
                  כתב ב נערך לאחרונה על ידי
                  #28

                  @דוד ל.ט.

                  תוכל גם במקום להקצות שם לקובץ אחד אחד להשתמש בשם הקלאס ע"י GetType().Name

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

                  public static void Serialize<T>(T obj)
                          {                        
                               using (FileStream fs = new FileStream(obj.GetType().Name, FileMode.Create))
                              {
                                  XmlSerializer donorXmlS = new XmlSerializer(typeof(T));
                                  donorXmlS.Serialize(fs, obj);
                              }       
                          }
                  

                  אני מצרף כאן את כל הקבצים של התכנה.. אם זה יעזור למישהו..
                  AppDonorNew.rar
                  שכוייח!!

                  פורסם במקור בפורום CODE613 ב02/08/2015 00:08 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #29

                    פשוט מאוד.
                    אתה צריך ללמוד קצת לדבאג. אם תעקוב אחרי מה שקורה, אז דבר ראשון תראה ששם שחוזר מהמתודה GetType().Name הוא List'1. למזלך זה שם חוקי, אבל הבעיה שהשם זהה עבור כל הליסטים! בקריאה יש שגיאה כי יש בXML סוג שונה לחלוטין (הסוג האחרון שנשמר הוא הדורס האחרון)...
                    בשביל לפתור זאת צריך לגשת לטיפוס הפרמטר הגנרי (הT של הליסט). חיפשתי בגוגל ומצאתי, ככה:

                    GetType().GenericTypeArguments[0].Name
                    

                    דבר שני, שים לב שאתה מעביר שם קובץ ללא נתיב. ומתודת הסריאליזציה והדסריאליזציה לא מקבלות שום פרמטר בנוגע לתיקיה בה לטעון ולשמור. אז למה אין שגיאה? כי אז זה נשמר יחסית ל"תיקיה נוכחית" ש[u:4yywltfk]בדרך כלל[/u:4yywltfk] זו התיקיה ממנה הרצת את התוכנה.

                    הצלחה רבה!
                    על כל שגיאה בתכנות יש מאה הצלחות בעתיד.

                    פורסם במקור בפורום CODE613 ב02/08/2015 12:59 (+03:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    3
                    • A מנותק
                      A מנותק
                      avr416
                      כתב ב נערך לאחרונה על ידי
                      #30

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

                      public static class SerilizationAll
                          {        
                              //סריליזציה של כל התכנית
                              public static void Serilization()
                              {
                                  FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
                      
                                  if (folderBrowser.ShowDialog() == DialogResult.OK)
                                  {
                                      string folder = folderBrowser.SelectedPath;
                      
                                      folder += @"\userData\data\";//מוסיף לנתיב תיקיית משנה לשמירת הנתונים
                                      DirectoryInfo directoryInfo = new DirectoryInfo(folder);
                                      directoryInfo.Create();//יוצר את ספריות המשנה
                                                             //קורא למתודה שמבצעת את הסריליזציה  
                                      Serialize(AddTorem.donations,folder+AddTorem.donations.GetType().GenericTypeArguments[0].Name);
                                      Serialize(AddTorem.donors,folder+AddTorem.donors.GetType().GenericTypeArguments[0].Name);
                                      Serialize(AddTorem.credits,folder+AddTorem.credits.GetType().GenericTypeArguments[0].Name);
                                      Serialize(AddTorem.accounts,folder+AddTorem.accounts.GetType().GenericTypeArguments[0].Name);
                                  }
                              }
                              // מתודה גנרית לסריליזציה שמקבלת את סוג האובייקט והנתיב לשמירה
                              private static void Serialize<T>(T obj,string path)
                              {                        
                                   using (FileStream fs = new FileStream(path, FileMode.Create))
                                  {
                                      XmlSerializer donorXmlS = new XmlSerializer(typeof(T));
                                      donorXmlS.Serialize(fs, obj);
                                  }            
                              }
                      
                              //deserilization for all program
                              public static void Deserilization()
                              {
                                  FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
                                  if (folderBrowser.ShowDialog() == DialogResult.OK)
                                  {
                                      string folders = folderBrowser.SelectedPath;
                                      folders += @"\userData\data\";//מוסיף לנתיב את הנתיב לתיקיית משנה בה קיימים הנתונים
                                                                   //קורא למתודות שמבצעות את הסריליזציה על התיקייה שנבחרה
                                   AddTorem.donors = Deserilization(AddTorem.donors, folders + AddTorem.donors.GetType().GenericTypeArguments[0].Name);
                                   AddTorem.donations = Deserilization(AddTorem.donations, folders + AddTorem.donations.GetType().GenericTypeArguments[0].Name);
                                   AddTorem.accounts = Deserilization(AddTorem.accounts, folders + AddTorem.accounts.GetType().GenericTypeArguments[0].Name);
                                   AddTorem.credits = Deserilization(AddTorem.credits,folders+AddTorem.credits.GetType().GenericTypeArguments[0].Name);
                                  }
                              }
                      
                             //מתודה גנרית לדיסריליזציה שמקבלת את סוג האובייקט והנתיב לפתיחה
                              private static T Deserilization<T>(T returnObj,string path)
                              {        
                                  using (FileStream fs = new FileStream(path, FileMode.Open))
                                  {
                                      XmlSerializer xmlser = new XmlSerializer(typeof(T));
                                      return returnObj= (T)xmlser.Deserialize(fs);                
                                  }
                              }
                          }
                      }
                      

                      הקוד עושה אותו דבר, יותר יעיל והרבה הרבה יותר קצר!!
                      תודה לכולם על כל העצות!!! אין על הפורום שלנו :lol: :lol:

                      פורסם במקור בפורום CODE613 ב02/08/2015 16:32 (+03:00)

                      תגובה 1 תגובה אחרונה
                      2
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        כתב ב נערך לאחרונה על ידי
                        #31

                        ה+XXXXX.GetType().GenericTypeArguments[0].Name
                        עדיף שיהיה במתודות הסריאלזיציה/דסריאליזציה (path + ...).

                        פורסם במקור בפורום CODE613 ב02/08/2015 18:52 (+03:00)

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        תגובה 1 תגובה אחרונה
                        1

                        • 1
                        • 2
                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום