在C#中序列化和反序列化表达式树


92

有没有一种方法可以在C#中反序列化表达式,我想将表达式存储在数据库中并在运行时加载它们。


什么样的表情?正则表达式?
乔恩·林贾普

16
给定“树”,我将假设使用System.Linq.Expression类型表达式。
David Wengier,

Answers:


48

我继续研究在C#中对表达树进行序列化和反序列化提到的库

看起来该项目已被放弃(2008),但是我做了一些工作,现在可以在.NET 4.0和Silverlight中使用。我对他们的代码进行了错误修复,还使其与DAL更加独立。

http://expressiontree.codeplex.com/


2
+1提出可行的解决方案。我尝试在MSDN上使用原始库,但无法反序列化一个简单的二进制表达式节点。您的项目效果很好。谢谢!
Jacobs Data Solutions

2
是在Nuget上进行的项目吗?
Mohammad Dayyan

@ MohammadDayyan,Microsoft在其软件包管理工具方面犹豫不决,前后矛盾。有时ASP.NET CORE软件包可以与Nuget一起安装,在其他情况下,例如MongoDB驱动程序将无法通过NuGet获得。至少微软仍然有洞察力,允许NPM管理软件包。更有可能将其放到NPM
T. Webster

@RepoMan解决问题对我有帮助,对我来说意义重大。也许你可以在使用贡献一些文档-让我们的谈话..
T.韦伯斯特

14

另一个选择是code.msdn.com上的“ 表达式树序列化”项目-在这里似乎需要更多?

UPD:现在http://archive.msdn.microsoft.com/exprserialization


表达式树序列化代码已从代码库code.msdn.microsoft.com/exprserialization中删除,是否知道将其移到哪个位置或更好的替代方法?
Kiran Bheemarti 2011年

@基兰:你什么意思?代码下载仍然存在;检查页面顶部的下载标签。
罗伯特·哈维

是的,现在是现在,可能是暂时的情况,昨天我尝试上面的链接时,该页面引发了一个项目未找到错误。我看到了该项目并立即下载。谢谢!!!
Kiran Bheemarti 2011年

13

GitHub / Nuget上有一个名为MetaLinq的项目,旨在使表达发束的使用更加轻松。

它在可变且完全可序列化的普通表达式和“ EditableExpressions”之间进行转换,因此可以与Json,Xml,Binary等一起使用。

另请查看此博客文章以获取更多信息。


12

看看我的新库Serialize.Linq。它将linq表达式序列化为json,xml和二进制。


你以前用过这个吗?您的经历如何/发现任何限制?
Alexandre Brisebois 2012年

我在上一个项目中使用了类似的版本。效果很好。
esskar 2012年

您为什么要写一些使各层之间的界线更糟的东西?您正在促进DAL域对象向BAL的公开...除非您的库以某种方式自动将DTO(以及针对它们的查询)转换为域对象/查询。我在文档中没有看到任何表明此类行为的信息。
M.Babcock

@ M.Babcock:您要在表达式中使用的DTO与实体不是库逻辑的一部分。
esskar 2012年

4
@esskar您的博客/整个网站似乎都消失了。它移动了吗?
2015年

3

不完整 但是,动态LINQ示例可能会有所帮助。您当然可以将表达式序列化为字符串(在某种程度上-泛型看起来有点麻烦),但是没有内置的解析器。


我找不到如何使用样本(仅从另一个方向)将表达式序列化为字符串作为字符串并创建表达式树的方法。我叫什么方法?
Christopher Edwards


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.