Ошибка System.MissingMethodException: для типа System.Linq.Expressions.Expression`1 не определен конструктор без параметров.

Я хочу создать динамические выражения для своих веб-служб, чтобы клиентские приложения могли передавать динамические запросы для фильтрации данных по мере необходимости. С этой целью я пытаюсь сериализовать/десериализовать 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 я получаю сообщение об ошибке.

Я правильно оформил задействованные классы, и у них обоих есть конструкторы без параметров, поэтому я не могу понять, почему я получаю сообщение об ошибке.

Есть идеи?


person DomBurf    schedule 15.05.2020    source источник
comment
деревья выражений ни черта не сериализуются; у них есть ToString(), который дает представление лямбда, и это, вероятно, то, что выводит JsonConvert, но: нет никакой возможности тривиально десериализовать дерево выражений; это просто так не работает   -  person Marc Gravell    schedule 15.05.2020
comment
FWIW: я даже не могу запустить ваш код сериализации (скопируйте все из вопроса); Я получаю необработанное исключение. Newtonsoft.Json.JsonSerializationException: обнаружен цикл самоссылки для свойства «ManifestModule» с типом «System.Reflection.RuntimeModule». Путь "Тело.Метод.Модуль.Сборка".   -  person Marc Gravell    schedule 15.05.2020
comment
чтобы было ясно: ошибка не говорит вам, что ModuleEntityAdmin или ModuleEntityAdmins не хватает определенного конструктора; это говорит вам, что типы выражений отсутствуют.   -  person Marc Gravell    schedule 15.05.2020
comment
Существуют различные библиотеки для сериализации деревьев выражений, например эта и этот   -  person canton7    schedule 15.05.2020
comment
Что сказал Марк.. Но просто к вашему сведению, это не ваши классы без конструктора без параметров, это Expression<Func<, >>. Не имеет отношения, но мне кажется странным, что вы смешиваете JsonConvert и JavascriptSerializer. Последний устарел - не официально, а в собственных документах MS. [Чувак, я печатаю медленно, освежающе, и ты будешь со мной]   -  person pinkfloydx33    schedule 15.05.2020
comment
Я принял подход к выражениям только после прочтения других сообщений здесь, в которых говорилось, что это хороший подход для создания динамических запросов, которые можно сериализовать/десериализовать. Может быть, есть другие лучшие подходы?   -  person DomBurf    schedule 15.05.2020
comment
Я использую JavascriptSerializer, так как он обеспечивает поддержку больших файлов (я удалил этот код для ясности). У нас есть веб-службы, которые отправляют изображения большого размера, а другие сериализаторы не работают.   -  person DomBurf    schedule 15.05.2020
comment
@ canton7 опрятно, интересно, как те, кто работает с замыканиями / классами отображения, превратились в константные выражения ... особенно при десериализации. Я уверен, что есть куча крайних случаев   -  person pinkfloydx33    schedule 15.05.2020


Ответы (1)