Я хочу создать динамические выражения для своих веб-служб, чтобы клиентские приложения могли передавать динамические запросы для фильтрации данных по мере необходимости. С этой целью я пытаюсь сериализовать/десериализовать Expression в C#/.NET. что клиентское приложение может перейти в мой веб-сервис. К сожалению, я получаю следующую ошибку, когда пытаюсь десериализовать выражение.
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 для возврата одного экземпляра класса.
Expression<Func<ModuleEntityAdmins, ModuleEntityAdmin>> expr1 = m => m.Modules.Find(q => q.Id == 1);
Я сериализую Expression, используя следующую функцию.
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()
, который дает представление лямбда, и это, вероятно, то, что выводитJsonConvert
, но: нет никакой возможности тривиально десериализовать дерево выражений; это просто так не работает - person Marc Gravell   schedule 15.05.2020ModuleEntityAdmin
илиModuleEntityAdmins
не хватает определенного конструктора; это говорит вам, что типы выражений отсутствуют. - person Marc Gravell   schedule 15.05.2020Expression<Func<, >>
. Не имеет отношения, но мне кажется странным, что вы смешиваетеJsonConvert
иJavascriptSerializer
. Последний устарел - не официально, а в собственных документах MS. [Чувак, я печатаю медленно, освежающе, и ты будешь со мной] - person pinkfloydx33   schedule 15.05.2020