בחודשים האחרונים אני עובד על בניית תשתית המבוססת על Ado.Net Entity Framework (ראו פוסט קודם בנושא), כרגע בגרסה שהופצה עם Visual Studio 2008 SP1 Beta 1 ולפני כן עם גרסת ה-Beta 3.
מאחר והפרויקט הוא WEB-י, מבוסס ASP.NET Ajax (עם שדרוג קטן שלנו), אחד השלבים שהיינו צריכים לעבור בדרך הוא איך להעביר אובייקטי Entity Framework לצד קליינט כאשר הם מסורלזים ל-JSON
לאחר כמה נסיונות, התברר שבגרסת ה-Beta 3 של ה-Entity Framework קיימת בעיה לבצע סריאליזציה לכל טיפוס המכיל Association (בין אם Reference או Collection):
אוסף האובייקטים המיוצגים ע"י EF, כמו כל אוסף אובייקטים שניתן לייצג ב-NET., יכול להוות גרף ולא דווקא עץ, לדוגמה יחס "אח של" שבו אובייקט A קשור לאובייקט B אבל גם אובייקט B קשור לאובייקט A. כאשר אוסף אובייקטים זה עובר סריאליזציה שאינה בינארית (XML/JSON) הקישור הגרפי נאבד (באופן תיאורטי) והרכבתו מחדש היא בעייתית ואמורה להסתמך על המזהה (ה-KEY) שניתן לכל אובייקט בגרף. מסיבה זו, בחרו ב-Beta 3 לעזוב את זה לכרגע ולכן כל קשר בין ישויות ב-EF לא עבר סריאליזציה, לא באמצעות XmlSerializer ולא באמצעות DataContractSerializer.
אם תנסו בגרסה זו לבצע סריאליזציה ודה-סריאליזציה תקבלו אובייקטים בלי קשרים ביניהם.
לאחר פרסום הודעה בבלוגים של מיקרוסופט, המליצו לנו להתקין את ה-VS 2008 SP1 Beta 1 שבו כביכול ניתן פתרון לבעיה (ראו קישור). שמחים וטובי לבב התקנו את הגרסה - דבר שלכשעצמו מסתבר כבעייתי, במיוחד כאשר אין למחשבים חיבור לאינטרנט.
בבדיקה ראשונית שעשינו לאחר ההתקנה, נראה שאכן דברים עוברים סריאליזציה יותר טוב - כי בגרסה זו הם הוסיפו לסריאליזציה את ה-KEY, מה שהם נמנעו מלעשות בגרסה הקודמת.
אבל ... מתברר שהפעולה הזו עובדת רק בסריאליזציה ל-XML (מתווסף Attribute תחת xmlns אחר שמחזיק את ה-KEY), אבל מעיפה Exception כאשר מנסים לבצע סריאליזציה ל-JSON עם DataContractJsonSerializer (הגדרה של DataMember באופן שלא מאפשר סריאליזציה של האובייקטים).
אז כרגע אנחנו עובדים כמו חוראנים, מבצעים סריאליזציה עם JavaScriptSerializer של AJAX (שכמובן מתעלם מ-DataMemberAttribute) ודה-סריאליזציה עם DataContractJsonSerializer. אנחנו משתמשים באחרון כי הוא מאפשר לנו שליטה יותר טובה עם הדה-סריאזליזציה מאשר זה של AJAX.
על הבעיות בשילוב שני ה-Serializer-ים - בפעם הבאה ...