C# Error System.MissingMethodException:没有为';类型定义无参数构造函数;System.Linq.Expressions.Expression`1
我想为我的web服务创建动态表达式,以允许客户端应用程序传递动态查询,从而根据需要过滤数据。为此,我正试图在C#/.NET中序列化/反序列化一个表达式。客户端应用程序可以传递到我的web服务。不幸的是,我在尝试反序列化表达式时遇到以下错误C# Error System.MissingMethodException:没有为';类型定义无参数构造函数;System.Linq.Expressions.Expression`1,c#,json,serialization,deserialization,javascriptserializer,C#,Json,Serialization,Deserialization,Javascriptserializer,我想为我的web服务创建动态表达式,以允许客户端应用程序传递动态查询,从而根据需要过滤数据。为此,我正试图在C#/.NET中序列化/反序列化一个表达式。客户端应用程序可以传递到我的web服务。不幸的是,我在尝试反序列化表达式时遇到以下错误 System.MissingMethodException: No parameterless constructor defined for type of 'System.Linq.Expressions.Expression`1[[System.Func
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()
{
}
}
在这一点上,一切都很好
然后,我使用以下函数对字符串进行反序列化
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;
}
public T反序列化对象(字符串jsonObject)
{
T结果=默认值(T);
如果(!string.IsNullOrEmpty(jsonObject))
{
//下面一行有错误!!
结果=新的JavaScriptSerializer()。反序列化(jsonObject);
}
返回结果;
}
正是在尝试反序列化表达式时才出现错误
我已经正确地修饰了相关的类,它们都有无参数构造函数,所以我无法理解为什么会出现错误
有什么想法吗?有一个简单的实验室遥控器。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>();
expr1=m=>m.Modules.Find(q=>q.Id==1);
var remoteExpression=expr1.ToRemoteLinqExpression();
var s=SerializeObject(新的RequestExp{Expression=expr1});
RequestExp RequestExp=反序列化对象(s);
Expression=requestExp.Expression.ToLinqExpression();
表达式树根本不值得序列化;它们有一个ToString()
,它给出了lambda的表示,这可能就是JsonConvert
输出的内容,但是:不可能对表达式树进行简单的反序列化;它就是不能像那样工作fwiw:我甚至不能运行你的序列化代码(复制粘贴问题的所有内容);我得到“未处理的异常。Newtonsoft.Json.JsonSerializationException:为类型为“System.Reflection.RuntimeModule.Path”的属性“ManifestModule”检测到自引用循环,路径为“Body.Method.Module.Assembly”需要明确的是:错误并没有告诉您ModuleEntityAdmin
或ModuleEntityAdmins
缺少特定的构造函数;它告诉您表达式类型缺少它。有各种库可以序列化表达式树,如Marc所说的。。但仅供参考,没有无参数构造函数的类不是类,而是表达式。不相关,但我发现混合使用jsonvert
和JavascriptSerializer
很奇怪。后者是“过时的”-不是官方的,而是根据MS自己的文档。[老兄,我输入慢,刷新,你会告诉我]我在RequestExp类型上有一个错误。这是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>();