Serializing Expression Trees

August 9, 2008

2 comments

אחד מהדברים השימושיים ב-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. אני מקווה לפרסם בימים הקרובים תוצאות ראשוניות, אז הישארו קשובים, המשך יבוא …

Add comment
facebook linkedin twitter email

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

2 comments

  1. אביSeptember 29, 2008 ב 4:36 am

    היי עידו,
    יש חדש בנושא?

    Reply