Serialisieren und Deserialisieren von Expressionsbäumen in C #


89

Gibt es eine Möglichkeit, Ausdrücke in C # zu deserialisieren? Ich möchte Ausdrücke in einer Datenbank speichern und zur Laufzeit laden.


Welche Art von Ausdrücken? Regex?
Jon Limjap

16
Ich würde Ausdrücke vom Typ System.Linq.Expression annehmen, wenn man die "Bäume" bedenkt.
David Wengier

Antworten:


48

Ich setzte die Arbeit an der Bibliothek fort, die durch Serialisieren und Deserialisieren von Expressionsbäumen in C # erwähnt wurde.

Es sieht so aus, als ob das Projekt abgebrochen wurde (2008), aber ich habe einige Arbeiten daran durchgeführt und jetzt funktioniert es mit .NET 4.0 und Silverlight. Ich habe Fehlerbehebungen an ihrem Code vorgenommen und ihn auch DAL-unabhängiger gemacht.

http://expressiontree.codeplex.com/


2
+1 für die Entwicklung einer funktionierenden Lösung. Ich habe versucht, die ursprüngliche Bibliothek auf MSDN zu verwenden, und ein einfacher binärer Ausdrucksknoten konnte nicht deserialisiert werden. Ihr Projekt funktioniert hervorragend. Vielen Dank!
Jacobs Data Solutions

2
Ist es ein Projekt auf Nuget?
Mohammad Dayyan

@MohammadDayyan, Microsoft war bei seinem Paketverwaltungstool unentschlossen und inkonsistent. Manchmal können ASP.NET CORE-Pakete mit Nuget installiert werden, in anderen Fällen ist beispielsweise ein MongoDB-Treiber nicht über NuGet verfügbar. Zumindest Microsoft hatte die Einsicht, NPM die Verwaltung von Paketen zu ermöglichen. Wahrscheinlicher, dies auf NPM zu setzen
T. Webster

@RepoMan das Lösen eines Problems ist mir viel mehr wert, wenn es jemandem hilft. Vielleicht können Sie eine Dokumentation zur Verwendung beitragen - lassen Sie uns sprechen ..
T. Webster

14

Eine andere Option ist das Expression Tree Serialization- Projekt auf code.msdn.com - scheint mehr zu sein, was hier benötigt wird?

UPD: Jetzt http://archive.msdn.microsoft.com/exprserialization


Der Ausdrucksbaum-Serialisierungscode wird aus der Codegalerie code.msdn.microsoft.com/exprserialization entfernt. Gibt es eine Idee, wohin er verschoben wird, oder bessere Alternativen?
Kiran Bheemarti

@ Kiran: Was meinst du? Der Code-Download ist noch da; Überprüfen Sie die Registerkarte Downloads oben auf der Seite.
Robert Harvey

Ja, es ist jetzt, wahrscheinlich eine vorübergehende Sache, die Seite hat gestern einen Projektfehler ausgelöst, als ich den obigen Link ausprobiert habe. Ich sehe das Projekt und lade es jetzt herunter. Vielen Dank!!!
Kiran Bheemarti

13

Auf GitHub / Nuget gibt es ein Projekt namens MetaLinq , das die Arbeit mit Ausdrucksstress einfacher machen soll.

Es konvertiert zwischen normalen Ausdrücken und 'EditableExpressions', die veränderlich und vollständig serialisierbar sind und daher mit Json, Xml, Binary usw. verwendet werden können.

Überprüfen Sie auch diesen Blog-Beitrag für weitere Informationen.


11

Schauen Sie sich meine neue Bibliothek Serialize.Linq an . Es serialisiert Linq-Ausdrücke in JSON, XML und Binär.


hast du das schon mal benutzt? Wie war Ihre Erfahrung / finden Sie irgendwelche Einschränkungen?
Alexandre Brisebois

Ich habe in meinem letzten Projekt eine ähnliche Version davon verwendet. funktioniert gut.
Esskar

Warum würden Sie etwas schreiben, das die Grenzen zwischen den Ebenen noch schlimmer macht? Sie fördern die Exposition von DAL-Domänenobjekten gegenüber der BAL ... es sei denn, Ihre Bibliothek konvertiert DTOs (und die Abfragen gegen sie) automatisch in Domänenobjekte / -abfragen. Ich sehe in den Dokumenten nichts, was auf ein solches Verhalten hinweist.
M.Babcock

@ M.Babcock: Was Sie in Ihren Ausdrücken DTO vs Entities verwenden möchten, ist nicht Teil der Logik der Bibliothek.
Esskar

4
@esskar dein Blog / deine ganze Seite scheint weg zu sein. hat es sich bewegt?
Jon

2

Nicht vollständig; Das Dynamic LINQ- Beispiel kann jedoch etwas hilfreich sein. Sie können einen Ausdruck sicherlich in einen String serialisieren (bis zu einem gewissen Grad - Generika sehen etwas verrückt aus), aber es gibt keinen eingebauten Parser.


Ich kann nicht herausfinden, wie ein Ausdruck mithilfe des Beispiels in eine Zeichenfolge serialisiert wird, nur in die andere Richtung, um ihn als Zeichenfolge zu verwenden und einen Ausdrucksbaum zu erstellen. Welche Methode rufe ich auf?
Christopher Edwards


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.