Сериализация и десериализация деревьев выражений в C #


92

Есть ли способ десериализации выражений в C #, я хотел бы хранить выражения в базе данных и загружать их во время выполнения.


какие выражения? Регулярное выражение?
Джон Лимджап,

16
Я бы предположил выражения типа System.Linq.Expression, учитывая "деревья".
Дэвид Венгер,

1
вы можете использовать codeproject.com/Articles/851187/…
Мохаммад Дайян

Ответы:


48

Я продолжил работу над библиотекой, о которой упоминалось в разделе «Сериализация и десериализация деревьев выражений в C #».

Похоже, что проект был заброшен (2008 г.), но я немного поработал над ним, и теперь он работает с .NET 4.0 и Silverlight. Я исправил ошибки в их коде, а также сделал его более независимым от DAL.

http://expressiontree.codeplex.com/


2
+1 за то, что нашел рабочее решение. Я попытался использовать исходную библиотеку в MSDN, и она не смогла десериализовать простой узел двоичного выражения. Ваш проект отлично работает. Благодарность!
Jacobs Data Solutions

2
Это проект на Nuget?
Мохаммад Дайян

@MohammadDayyan, Microsoft была нерешительна и непоследовательна в отношении своего инструмента управления пакетами. Иногда пакеты ASP.NET CORE можно установить с помощью Nuget, в других случаях, например, драйвер MongoDB не будет доступен через NuGet. Тем не менее, по крайней мере, у Microsoft было понимание, позволяющее NPM управлять пакетами. Скорее всего, поставлю это на NPM
Т. Вебстер

@RepoMan: решение проблемы для меня гораздо дороже, когда это кому-то помогает. Может быть, вы можете предоставить какую-нибудь документацию по использованию - давайте поговорим ..
Т. Вебстер

14

Другой вариант - это проект сериализации дерева выражений на code.msdn.com - может показаться, что здесь нужно больше?

UPD: Теперь http://archive.msdn.microsoft.com/exprserialization


Код сериализации дерева выражений удален из галереи кода code.msdn.microsoft.com/exprserialization , есть идеи, куда он перемещен, или лучшие альтернативы?
Kiran Bheemarti

@ Киран: Что ты имеешь в виду? Загрузка кода все еще существует; проверьте вкладку загрузок вверху страницы.
Роберт Харви

Да, сейчас это, вероятно, временное явление. Вчера, когда я попробовал ссылку выше, страница выкидывала ошибку «проект не найден». Я вижу проект и скачиваю сейчас. Благодарность!!!
Kiran Bheemarti

13

На GitHub / Nuget есть проект MetaLinq , цель которого упростить работу с выражением tress.

Он преобразуется между обычными выражениями и «EditableExpressions», которые являются изменяемыми и полностью сериализуемыми, поэтому могут использоваться с Json, Xml, Binary и т. Д.

Также проверьте это сообщение в блоге для получения дополнительной информации.


12

взгляните на мою новую библиотеку Serialize.Linq . Он сериализует выражения linq в json, xml и двоичные файлы.


вы использовали это раньше? Каким был ваш опыт / какие ограничения?
Alexandre Brisebois

Я использовал аналогичную версию в своем последнем проекте. работает хорошо.
esskar

Зачем писать что-то, что еще больше размывает линии между уровнями? Вы продвигаете раскрытие объектов домена DAL в BAL ... если ваша библиотека каким-то образом автоматически не преобразует DTO (и запросы к ним) в объекты / запросы домена. Я не вижу в документации ничего, указывающего на такое поведение.
M.Babcock

@ M.Babcock: то, что вы хотите использовать в своих выражениях DTO vs Entities, не является частью логики библиотеки.
esskar 09

4
@esskar ваш блог / весь сайт, кажется, исчез. он переехал?
Джон

3

Не полностью; однако пример Dynamic LINQ может немного помочь. Вы, конечно, можете сериализовать выражение в строку (до некоторой степени - универсальные шаблоны выглядят немного странно), но встроенного парсера нет.


Я не могу понять, как сериализовать выражение в строку, используя образец, только в другом направлении, чтобы взять его за строку и создать дерево выражения. Какой метод мне вызвать?
Кристофер Эдвардс,


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.