Serializacja i deserializacja drzew wyrażeń w języku C #


92

Czy istnieje sposób na deserializację wyrażeń w C #, chciałbym przechowywać wyrażenia w bazie danych i ładować je w czasie wykonywania.


jakiego rodzaju wyrażenia? Regex?
Jon Limjap

16
Zakładałbym wyrażenia typu System.Linq.Expression, biorąc pod uwagę "drzewa".
David Wengier

Odpowiedzi:


48

Kontynuowałem pracę nad biblioteką, o której wspomniano w Serializacji i deserializacji drzew wyrażeń w C #

Wygląda na to, że projekt został porzucony (2008), ale trochę popracowałem nad nim i teraz działa z .NET 4.0 i Silverlight. Zrobiłem poprawki błędów w ich kodzie, a także uczyniłem go bardziej niezależnym od DAL.

http://expressiontree.codeplex.com/


2
+1 za znalezienie działającego rozwiązania. Próbowałem użyć oryginalnej biblioteki w MSDN i nie mogłem deserializować prostego binarnego węzła wyrażenia. Twój projekt działa świetnie. Dzięki!
Jacobs Data Solutions,

2
Czy to projekt na Nuget?
Mohammad Dayyan

@MohammadDayyan, Microsoft był niezdecydowany i niekonsekwentny w kwestii swojego narzędzia do zarządzania pakietami. Czasami pakiety ASP.NET CORE można zainstalować za pomocą Nuget, w innych przypadkach np. Sterownik MongoDB nie będzie dostępny przez NuGet. Wciąż przynajmniej Microsoft miał wgląd, aby pozwolić NPM na zarządzanie pakietami. Bardziej prawdopodobne jest umieszczenie tego na NPM
T. Webster,

@RepoMan rozwiązanie problemu jest dla mnie o wiele więcej warte, gdy komuś pomaga. Może mógłbyś dołączyć jakąś dokumentację dotyczącą użytkowania - porozmawiajmy ..
T. Webster,

14

Inną opcją jest projekt serializacji drzewa wyrażeń w witrynie code.msdn.com - wydaje się, że jest więcej tego, czego potrzeba tutaj?

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


Kod serializacji drzewa wyrażeń został usunięty z galerii kodu code.msdn.microsoft.com/exprserialization. Masz jakiś pomysł, gdzie został przeniesiony, lub lepsze alternatywy?
Kiran Bheemarti,

@Kiran: Co masz na myśli? Kod do pobrania jest nadal dostępny; sprawdź kartę pobierania u góry strony.
Robert Harvey

Tak jest teraz, chyba chwilowa rzecz, strona wyrzucała wczoraj błąd nie znaleziono projektu, gdy próbowałem powyższego linku. Widzę projekt i pobieram teraz. Dzięki!!!
Kiran Bheemarti

13

W serwisie GitHub / Nuget istnieje projekt o nazwie MetaLinq, którego celem jest ułatwienie pracy z warkoczem wyrażeń.

Konwertuje między zwykłymi wyrażeniami i `` EditableExpressions '', które są zmienne iw pełni serializowalne, więc mogą być używane z Json, Xml, Binary itp.

Sprawdź również ten wpis na blogu, aby uzyskać więcej informacji.


12

spójrz na moją nową bibliotekę Serialize.Linq . Serializuje wyrażenia linq do formatu json, xml i binarnego.


używałeś tego wcześniej? jakie było twoje doświadczenie / znalazłeś jakieś ograniczenia
Alexandre Brisebois

Użyłem podobnej wersji w moim ostatnim projekcie. działa dobrze.
esskar

Dlaczego miałbyś pisać coś, co gorzej zaciera granice między poziomami? Promujesz ekspozycję obiektów domeny DAL na BAL ... chyba że twoja biblioteka w jakiś sposób automatycznie konwertuje DTO (i zapytania skierowane do nich) na obiekty / zapytania domeny. Nie widzę w dokumentach nic wskazującego na takie zachowanie.
M.Babcock

@ M.Babcock: to, czego chcesz użyć w wyrażeniach DTO vs Entities, nie jest częścią logiki biblioteki.
esskar

4
@esskar Twój blog / cała witryna wydaje się zniknąć. czy to się poruszyło?
Jon

3

Nie w całości; Jednak przykład Dynamic LINQ może trochę pomóc. Z pewnością można serializować wyrażenie do łańcucha (do pewnego stopnia - typy generyczne wyglądają trochę dziwnie), ale nie ma wbudowanego parsera.


Nie mogę dowiedzieć się, jak serializować wyrażenie do ciągu przy użyciu próbki, tylko w innym kierunku, aby wziąć go jako ciąg i utworzyć drzewo wyrażenia. Jaką metodę mam wywołać?
Christopher Edwards,


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.