<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Ido Flatow&amp;#39;s Blog&lt;h3&gt;Veni Vidi Scripsi&lt;/h3&gt; : Bug, JSON, DataContractJsonSerializer</title><link>http://blogs.microsoft.co.il/blogs/idof/archive/tags/Bug/JSON/DataContractJsonSerializer/default.aspx</link><description>Tags: Bug, JSON, DataContractJsonSerializer</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Entity Framework ו-JSON, שילוב בעייתי</title><link>http://blogs.microsoft.co.il/blogs/idof/archive/2008/07/20/entity-framework-json.aspx</link><pubDate>Sun, 20 Jul 2008 19:43:50 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:123357</guid><dc:creator>Ido Flatow</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/idof/rsscomments.aspx?PostID=123357</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/idof/archive/2008/07/20/entity-framework-json.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt; &lt;p&gt;בחודשים האחרונים אני עובד על בניית תשתית המבוססת על Ado.Net Entity Framework (ראו &lt;a href="http://blogs.microsoft.co.il/blogs/idof/archive/2008/06/20/3-0-c-csharpcodeprovider.aspx" target="_blank"&gt;פוסט קודם&lt;/a&gt; בנושא), כרגע בגרסה שהופצה עם Visual Studio 2008 SP1 Beta 1 ולפני כן עם גרסת ה-Beta 3.&lt;/p&gt; &lt;p&gt;מאחר והפרויקט הוא WEB-י, מבוסס ASP.NET Ajax (עם שדרוג קטן שלנו), אחד השלבים שהיינו צריכים לעבור בדרך הוא איך להעביר אובייקטי Entity Framework לצד קליינט כאשר הם מסורלזים ל-JSON&lt;/p&gt; &lt;p&gt;לאחר כמה נסיונות, התברר שבגרסת ה-Beta 3 של ה-Entity Framework קיימת בעיה לבצע סריאליזציה לכל טיפוס המכיל Association (בין אם Reference או Collection):&lt;/p&gt; &lt;p&gt;אוסף האובייקטים המיוצגים ע&amp;quot;י EF, כמו כל אוסף אובייקטים שניתן לייצג ב-NET., יכול להוות גרף ולא דווקא עץ, לדוגמה יחס &amp;quot;אח של&amp;quot; שבו אובייקט A קשור לאובייקט B אבל גם אובייקט B קשור לאובייקט A. כאשר אוסף אובייקטים זה עובר סריאליזציה שאינה בינארית (XML/JSON) הקישור הגרפי נאבד (באופן תיאורטי) והרכבתו מחדש היא בעייתית ואמורה להסתמך על המזהה (ה-KEY) שניתן לכל אובייקט בגרף. מסיבה זו, בחרו ב-Beta 3 לעזוב את זה לכרגע ולכן כל קשר בין ישויות ב-EF לא עבר סריאליזציה, לא באמצעות XmlSerializer ולא באמצעות DataContractSerializer.&lt;/p&gt; &lt;p&gt;אם תנסו בגרסה זו לבצע סריאליזציה ודה-סריאליזציה תקבלו אובייקטים בלי קשרים ביניהם.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;לאחר פרסום הודעה בבלוגים של מיקרוסופט, המליצו לנו להתקין את ה-VS 2008 SP1 Beta 1 שבו כביכול ניתן פתרון לבעיה (ראו &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3569648&amp;amp;SiteID=1" target="_blank"&gt;קישור&lt;/a&gt;). שמחים וטובי לבב התקנו את הגרסה - דבר שלכשעצמו מסתבר כבעייתי, במיוחד כאשר אין למחשבים &lt;a href="http://blogs.microsoft.co.il/blogs/idof/archive/2008/07/20/vs-2008-sp1-beta-1.aspx" target="_blank"&gt;חיבור לאינטרנט&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;בבדיקה ראשונית שעשינו לאחר ההתקנה, נראה שאכן דברים עוברים סריאליזציה יותר טוב - כי בגרסה זו הם הוסיפו לסריאליזציה את ה-KEY, מה שהם נמנעו מלעשות בגרסה הקודמת.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;אבל ... מתברר שהפעולה הזו עובדת רק בסריאליזציה ל-XML (מתווסף Attribute תחת xmlns אחר שמחזיק את ה-KEY), אבל מעיפה Exception כאשר מנסים לבצע סריאליזציה ל-JSON עם DataContractJsonSerializer (הגדרה של DataMember באופן שלא מאפשר סריאליזציה של האובייקטים).&lt;/p&gt; &lt;p&gt;אז כרגע אנחנו עובדים כמו חוראנים, מבצעים סריאליזציה עם JavaScriptSerializer של AJAX (שכמובן מתעלם מ-DataMemberAttribute) ודה-סריאליזציה עם DataContractJsonSerializer. אנחנו משתמשים באחרון כי הוא מאפשר לנו שליטה יותר טובה עם הדה-סריאזליזציה מאשר זה של AJAX.&lt;/p&gt; &lt;p&gt;על הבעיות בשילוב שני ה-Serializer-ים - בפעם הבאה ...&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=123357" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/Bug/default.aspx">Bug</category><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/JSON/default.aspx">JSON</category><category domain="http://blogs.microsoft.co.il/blogs/idof/archive/tags/DataContractJsonSerializer/default.aspx">DataContractJsonSerializer</category></item></channel></rss>