在 C# 中序列化和反序列化表达式树
Posted
技术标签:
【中文标题】在 C# 中序列化和反序列化表达式树【英文标题】:Serializing and Deserializing Expression Trees in C# 【发布时间】:2010-09-18 02:13:29 【问题描述】:有没有办法在 C# 中反序列化表达式,我想将表达式存储在数据库中并在运行时加载它们。
【问题讨论】:
什么样的表达方式?正则表达式? 我会假设 System.Linq.Expression 类型表达式,给定“树”。 你可以使用codeproject.com/Articles/851187/… 【参考方案1】:我继续在 Serializing and Deserializing Expression Trees in C# 提到的库上工作
看起来该项目已被放弃(2008 年),但我做了一些工作,现在它可以与 .NET 4.0 和 Silverlight 一起使用。我对他们的代码进行了错误修复,并使其更加独立于 DAL。
http://expressiontree.codeplex.com/
【讨论】:
+1 提出了一个可行的解决方案。我尝试使用 MSDN 上的原始库,它无法反序列化简单的二进制表达式节点。你的项目效果很好。谢谢! 它是 Nuget 上的项目吗? @MohammadDayyan,微软一直在其包管理工具上优柔寡断和不一致。有时 ASP.NET CORE 包可以与 Nuget 一起安装,在其他情况下,例如MongoDB 驱动程序将无法通过 NuGet 获得。至少微软仍然有洞察力允许 NPM 管理包。更有可能将其放在 NPM 上 @RepoMan 解决问题在帮助某人时对我来说更有价值。也许你可以贡献一些关于使用的文档——让我们谈谈..【参考方案2】:在 GitHub/Nuget 上有一个名为 MetaLinq 的项目,旨在让使用表达式树更容易。
它在普通表达式和可变且完全可序列化的“可编辑表达式”之间转换,因此可以与 Json、Xml、二进制等一起使用。
也可以查看blog post 了解更多信息。
【讨论】:
【参考方案3】:其他选项是 code.msdn.com 上的 Expression Tree Serialization 项目 - 这里似乎更需要什么?
更新:现在http://archive.msdn.microsoft.com/exprserialization
【讨论】:
表达式树序列化代码已从代码库code.msdn.microsoft.com/exprserialization 中删除,知道将其移至何处或更好的替代方案吗? @Kiran:你什么意思?代码下载还在;检查页面顶部的下载选项卡。 是的,现在可能是暂时的,昨天我尝试上面的链接时,页面抛出了一个未找到项目的错误。我现在看到项目并下载。谢谢!!!【参考方案4】:看看我的新图书馆Serialize.Linq。它将 linq 表达式序列化为 json、xml 和二进制。
【讨论】:
你以前用过这个吗?您的体验如何/发现任何限制? 我在上一个项目中使用了类似的版本。效果很好。 你为什么要写一些让层级之间的界限变得更糟的东西?您正在促进 DAL 域对象向 BAL 的公开......除非您的库以某种方式自动将 DTO(以及针对它们的查询)转换为域对象/查询。我在文档中没有看到任何表明这种行为的内容。 @M.Babcock:您想在表达式中使用的 DTO 与实体不是库逻辑的一部分。 @esskar 你的博客/整个网站似乎已经消失了。搬家了吗?【参考方案5】:不完整;但是,Dynamic LINQ 示例可能会有所帮助。您当然可以将表达式序列化为字符串(在某种程度上 - 泛型看起来有点古怪),但没有内置的解析器。
【讨论】:
我不知道如何使用示例将表达式序列化为字符串,只有另一个方向,将其作为字符串并创建表达式树。我该调用什么方法?【参考方案6】:WCF RIA 服务允许序列化IQuerayble<T>
WCF RIA Services Part 3 – Updating Data
【讨论】:
我相信这更相关:silverlightshow.net/items/…【参考方案7】:我正在做一个序列化表达式的项目。没关系,你可以使用它。 http://www.codeproject.com/Articles/851187/ServicePredicateBuilder-for-creating-Serializable
【讨论】:
以上是关于在 C# 中序列化和反序列化表达式树的主要内容,如果未能解决你的问题,请参考以下文章