【问题标题】:Error System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1错误 System.MissingMethodException:没有为“System.Linq.Expressions.Expression”1 类型定义无参数构造函数
【发布时间】:2020-05-15 08:30:49
【问题描述】:

我想为我的 Web 服务创建动态表达式,以允许客户端应用程序传递动态查询以根据需要过滤数据。为此,我尝试在 C#/.NET 中序列化/反序列化 Expression。客户端应用程序可以传递到我的 Web 服务中。不幸的是,当我尝试反序列化表达式时出现以下错误。

System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1[[System.Func`2[[Common.Entities.ModuleEntityAdmins, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]

我正在反序列化的类包含无参数构造函数,并使用适当的 [DataContract][DataMember] 属性进行修饰。

[DataContract]
public class ModuleEntityAdmins
{
    [DataMember]
    public List<ModuleEntityAdmin> Modules { get; set; }

    /// <summary>
    /// Default constructor
    /// </summary>
    public ModuleEntityAdmins()
    {
        this.Modules = new List<ModuleEntityAdmin>();
    }
}

[DataContract]
public class ModuleEntityAdmin
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public bool Active { get; set; }
    [DataMember]
    public string Name { get; set; }

    /// <summary>
    /// Default constructor
    /// </summary>
    public ModuleEntityAdmin()
    {
    }
}

我创建了一个简单的表达式来返回该类的单个实例。

Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);

我使用以下函数序列化表达式

public string SerializeObject(object objtoserialize)
{
    return JsonConvert.SerializeObject(objtoserialize);
}

此时一切都很好。

然后我使用以下函数反序列化字符串。

public T DeserializeObject<T>(string jsonObject)
{
    T result = default(T);
    if (!string.IsNullOrEmpty(jsonObject))
    {
        //errors on the line below!!
        result = new JavaScriptSerializer().Deserialize<T>(jsonObject);
    }
    return result;
}

当我试图反序列化 Expression 时,我得到了错误。

我已经正确修饰了所涉及的类,并且它们都有无参数的构造函数,所以我不明白为什么会出现错误。

有什么想法吗?

【问题讨论】:

  • 表达式树不值得序列化;他们有一个ToString(),它给出了lambda的表示,这可能是JsonConvert正在输出的内容,但是:反序列化表达式树的可能性为零;它只是不能那样工作
  • FWIW:我什至无法运行您的序列化代码(复制粘贴问题中的所有内容);我得到“未处理的异常。Newtonsoft.Json.JsonSerializationException:检测到属性“ManifestModule”的自引用循环,类型为“System.Reflection.RuntimeModule”。路径“Body.Method.Module.Assembly”。”
  • 要明确:错误并没有告诉您ModuleEntityAdminModuleEntityAdmins 缺少特定的构造函数;它告诉您 表达式类型 缺少它。
  • 有多种库可以序列化表达式树,如this onethis one
  • Marc 说了什么.. 但仅供参考,没有无参数构造函数的不是你的类,而是Expression&lt;Func&lt;, &gt;&gt;。不相关,但我觉得你混合JsonConvertJavascriptSerializer 很奇怪。后者是“过时的”——不是官方的,而是根据 MS 自己的文档。 [我打字慢,精神焕发,你会成为我的人]

标签: c# json serialization deserialization javascriptserializer


【解决方案1】:

存在简单的实验室 Remote.Linq - https://github.com/6bee/Remote.Linq

您可以尝试示例代码:

            Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);

            var remoteExpression = expr1.ToRemoteLinqExpression();

            var s = SerializeObject(new RequestExp { Expression = expr1 });

            RequestExp requestExp = DeserializeObject< RequestExp > (s);

            Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expression = requestExp.Expression.ToLinqExpression<ModuleEntityAdmins, ModuleEntityAdmin>();           

【讨论】:

  • 我在 RequestExp 类型上遇到错误。这是 Remote.Linq 的一部分吗?
猜你喜欢
  • 2014-02-28
  • 2011-03-29
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多