【发布时间】: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”。”
-
要明确:错误并没有告诉您
ModuleEntityAdmin或ModuleEntityAdmins缺少特定的构造函数;它告诉您 表达式类型 缺少它。 -
Marc 说了什么.. 但仅供参考,没有无参数构造函数的不是你的类,而是
Expression<Func<, >>。不相关,但我觉得你混合JsonConvert和JavascriptSerializer很奇怪。后者是“过时的”——不是官方的,而是根据 MS 自己的文档。 [我打字慢,精神焕发,你会成为我的人]
标签: c# json serialization deserialization javascriptserializer