DCSIMG
Serializing Expression Trees - 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

Serializing Expression Trees

אחד מהדברים השימושיים ב-3.0 #C, אע"פ שהוא מעט הוזנח במצגות השונות, הוא עץ הביטויים (Expression Tree) שהוא הדבק שמחבר את Lambda Expressions ו-Linq.

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

אבל... בדבר אחד Expression Tree נכשל - אי אפשר לבצע לו סריאליזציה.

הדבר מוסבר בפורומים השונים, כדוגמת כאן, והסיבות נשמעות די הגיוניות:

  1. המחלקות השונות של Expression Tree מכילות מאפיינים מטיפוסי Reflection (מחלקות Type, MemberInfo וכדומה) - טיפוסים אלו בעייתיים לסריאליזציה.
  2. Expression Tree הוא Immutable, היינו מרגע שנוצרו לא ניתן לשנותן. מה זה מרמז על מבנה המחלקה? צדקתם, אין להם Default Ctor. ומה קורה למחלקה שאין לה Default Ctor? שוב נכון, אין אפשר לעשות לה DeSerialize !!

אלו 2 בעיות רציניות שמאוד מקשות על האפשרות לבצע סריאליזציה ל-Expression Tree באמצעים "מובנים" של ה-Framework (כדוגמת XmlSerializer או DataContractSerializer).

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

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

Comments

אבי said:

היי עידו,

יש חדש בנושא?

# September 29, 2008 4:36 AM

Ido Flatow said:

I&#39;ve blogged before (in hebrew) about the difficulty of serializing expression trees to XML. To conclude

# October 5, 2008 12:55 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: