DCSIMG
Entity Framework ו-JSON, שילוב בעייתי - Ido Flatow's Blog Veni Vidi Scripsi

Ido Flatow's Blog

Veni Vidi Scripsi

News

Have you heard me speak?
Powered
<style type='text/css' media='screen' id='sm_css'> #smix {overflow: visible;height: auto;border-radius: 10px;max-width: 250px;background-color: #323232;text-align: left;font-size: 12px;line-height: 16px;font-family:'Lucida Sans Unicode','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;} #smix a {color: #0056CC;text-decoration: none;} #smix .sm_head {color: #fff; line-height: 1em;font-size: 1.4em;padding: 10px;color: #fff;} #smix .sm_lanyard_wrapper {background-color: #fff;;clear: both;width: 97%;margin: 0 auto;margin-bottom: 0px;} #smix .sm_lanyard_content {padding: 7px;}#smix button.sm_rec, #smix a.sm_rec, #smix input[type=submit].sm_rec { padding: 6px 10px; -webkit-border-radius: 2px 2px;-moz-border-radius: 2px; border-radius: 2px; border: solid 1px rgb(153, 153, 153); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(221, 221, 221))); color: #333; text-decoration: none; cursor: pointer; display: inline-block; text-align: center; text-shadow: 0px 1px 1px rgba(255,255,255,1); line-height: 1; }#smix .sm_rec:hover { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(248, 248, 248)), to(rgb(221, 221, 221))); }#smix .sm_rec:active { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(204, 204, 204)), to(rgb(221, 221, 221))); }#smix .sm_rec.medium { padding: 3px 7px; font-size: 13px; }#smix .sm_rec span.icon.thumbs_up {background-position: 0px 36px;vertical-align: text-top;display: inline-block;margin-right: 4px;height: 18px;width: 16px;background-image: url(http://speakermix.com/images/new/thumbsold.png);}#smix .sm_rec:hover span.icon.thumbs_up {background-position: 0px 18px;} #smix .sm_events {padding:2px 0px 4px 0px;} #smix .sm_section {font-size: 10px; border-bottom: 1px solid silver; margin-bottom: 6px;} #smix .sm_subline {font-size:120%;margin-top:4px;font-weight:bold} #smix .powered {text-align: right} #smix .powered img {margin: 7px} </style>
Sela Technology Center

Advertisement

Entity Framework ו-JSON, שילוב בעייתי

בחודשים האחרונים אני עובד על בניית תשתית המבוססת על 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-ים - בפעם הבאה ...

Comments

Rotem Bloom said:

שמע יחסית למה שהיה פעם עם JSON החיים שלכם דבש.

מה לגבי תיקון לבעיה שיש ב-DataContractJsonSerializer הם יתקנו את זה בקרוב?

# July 20, 2008 5:43 PM

Ido Flatow said:

הי רותם,

לפי מה שכתבו בפורום, הם "העבירו" את התלונה לצוות של אסטוריה (data services), הם כנראה אחראים על ה-serializer הזה (לא ברור לי למה, חשבתי שצוות ה-AJAX אמור לטפל בזה). נחכה ונראה, אני לא מצפה ליותר מדי מהגרסה הזו, אולי מ-ef v2 שמי יודע מתי יצא (רשמית 1.0 עדין לא יצא הרי)

# July 20, 2008 6:43 PM

Ido Flatow said:

בכללית, שתיהן טכנולוגיות שהן &quot;תוספות&quot; לתשתית המוכרת - Ado.Net Entity Framework ו-Asp.Net AJAX

# August 16, 2008 4:43 AM

Ido Flatow said:

I&#39;ve wrote before about trying to serialize EF objects to JSON ( post in Hebrew ), which to conclude

# September 30, 2008 8:05 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: