serialization: קובץ XML עם ג'יבריש
-
שיניתי את הserialization של התוכנה שלי ליצירת קובץ XML, אבל כשאני פותח אותו בכתבן אז אני מקבל קובץ XML מעולה, הבעיה שאת הנתונים בעברית הוא מציג לי בג'יבריש. איך אפשר לתקן זאת? בהגדרות של הסריליזציה, או שזו בכלל בעיה בכתבן??
(נראה לי שזו בעיה בסריליזציה כי כשאני מנסה לפתוח בתוכנה את הקובץ שנוצר - ע"י מתודה של דסריליזציה - הוא קורס וכותב לי שהקובץ פגום..)
תודה לכולכם על כל העזרה!!פורסם במקור בפורום CODE613 ב05/07/2015 19:24 (+03:00)
-
זה הקוד:
public static void SaveDonorsOfXml(string fileName, List<Donor> donor)//serialization of XML { var myObject = donor; using (FileStream outStream = new FileStream(fileName, FileMode.Create)) { XmlSerializer xmlser = new XmlSerializer(typeof(List<Donor>)); xmlser.Serialize(outStream, myObject); } }
וזה הפלט שנוצר:
<?xml version="1.0"?> <ArrayOfDonor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Donor> <Id>0</Id> <FirstName>׳׳‘׳¨׳”׳</FirstName> <LastName>׳׳—׳™׳˜׳•׳‘</LastName> <Tel>6847777</Tel> <Email></Email> <howDonat>creditcard</howDonat> <freq>disposable</freq> <Adress>׳₪׳¡׳’׳•׳×</Adress> <sumDonation>10</sumDonation> <startDonor>2015-07-05T10:06:01.4448172+03:00</startDonor> <DatePay>0</DatePay> </Donor> <Donor> <Id>1</Id> <FirstName>׳×׳—׳™׳”</FirstName> <LastName>׳׳—׳™׳˜׳•׳‘</LastName> <Tel>5930060</Tel> <Email></Email> <howDonat>creditcard</howDonat> <freq>disposable</freq> <Adress>׳₪׳¡׳’׳•׳×</Adress> <sumDonation>10</sumDonation> <startDonor>2015-07-05T10:06:25.6046538+03:00</startDonor> <DatePay>0</DatePay> </Donor> <Donor> <Id>2</Id> <FirstName>׳§׳•׳‘׳™</FirstName> <LastName>׳₪׳™׳’'׳•</LastName> <Tel /> <Email>kmp@gmail.com</Email> <howDonat>creditcard</howDonat> <freq>disposable</freq> <Adress>׳₪׳¡׳’׳•׳×</Adress> <sumDonation>10</sumDonation> <startDonor>2015-07-05T10:07:09.146535+03:00</startDonor> <DatePay>0</DatePay> </Donor> <Donor> <Id>3</Id> <FirstName>׳׳™׳¦׳™׳§</FirstName> <LastName>׳₪׳ ׳™׳¨׳™</LastName> <Tel /> <Email>itsikpa@gmail.com</Email> <howDonat>creditcard</howDonat> <freq>monthly</freq> <Adress /> <sumDonation>5</sumDonation> <startDonor>2015-07-05T10:13:05.9602828+03:00</startDonor> <DatePay>5</DatePay> </Donor> </ArrayOfDonor>
עכשיו פתחתי את הקובץ בוורד והוא מציג לי את המילים בעברית בצורה הפוכה..
פורסם במקור בפורום CODE613 ב06/07/2015 11:03 (+03:00)
-
לאחר בדיקה יותר לעומק..
את הג'יבריש הוא הציג לי כשפתחתי אותו בכתבן, כשפתחתי בוורד הוא הציג בעברית הפוכה, וכשפתחתי אותו בפנקס הרשימות אז הוא הציג את העברית מעולה!! מסקנה: עדיף להשתמש בפנקס (עם דף ועט..) :lol:
כמו כן, עכשיו בdebugging של התכנית הוא כותב לי שגיאה אחרת, שהערך אינו חוקי.
כלומר, אחד המשתנים הוא באיזה תאריך יחול החיוב של התורם, אולם יש בו ערך רק כאשר מדובר בתרומה קבועה ולא בתרומה חד"פ.
לכן, כאשר הוא עושה דסריליזציה ואין ערך במשתנה הנ"ל בקובץ, והוא מנסה להציב את הנתונים באובייקט החדש שהוא בונה, הוא מקבל שגיאה שאני עצמי זרקתי (שכאשר הערך גדול מ31 הוא לא בטווח.. ובעברית: ArgumentOutOfRangeException).
אציין רק שכשאר עשיתי סריליזציה בינרית לא היו לי שום בעיות עם זה.. (כנראה שבכל זאת בXML לא הכל וורוד..)
מה שעשיתי זה שיניתי את האימות של הset ל:
if(value>=0 &&value<=31) והכל בא על מקומו בשלום.
רק מעניין מדוע יש הבדל בין התוכנות השונות, ובין הסריליזציה הבינארית לXML.פורסם במקור בפורום CODE613 ב06/07/2015 13:49 (+03:00)
-
לא. השגיאה קרתה כשלא היה ערך במשתנה הזה. כיון שמדובר בתרומות חד פעמיות, אז בטופס אין אפשרות במצב כזה להזין ערך לתאריך החיוב.
הוקד הקודם היה:public int DatePay//תאריך תשלום בחודש (בתרומה קבועה בלבד) { get { return datePay; } set { if (value > 0 && value < 31) this.datePay = value; else throw new ArgumentOutOfRangeException("This value is not legal! select value from 1 to 31!"); } }
מתוך הנחה ש0 אינו יום חיוב.
בבינארי זה פעל יופי. אולם בXML כנראה כיון שאין ערך אז הוא מציב את הערך 0 ואז הוא קיבל שגיאה שזה ערך לא חוקי. אולם כששיניתי ואפשרתי גם את 0 עצמו, אז זה היה טוב.
לא יודע למה יש הבדל אבל עיין כאן שהוא כותב שבסריליזציה לXML צריך בנאי ריק, אולם בבינארי אין צורך. אז כנראה שזה בגלל זה (עדיין לא הבנתי למה, ואם אתה מבין אשמח אם תסביר).פורסם במקור בפורום CODE613 ב06/07/2015 14:27 (+03:00)
-
מעניין מאוד! תודה אברהם.
חיפשתי מקורות ומצאתי (http://stackoverflow.com/a/267904/1271037).הBinarySerialization שונה מאוד מהXML בנקודה זו: הוא ממש מצלם את מצב האובייקט (המשתנים) ובכלל לא ניגש דרך הset של המאפיינים, ואף יצירת האובייקט נעשית בדרך האקרית ללא הפעלת הCounstactor.
פורסם במקור בפורום CODE613 ב06/07/2015 16:32 (+03:00)