Asp.net: делегат (“Действие”) может быть сериализирован в состояние управления?

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

Попытка сохранить делегата в состоянии Управления приводит к ошибке сериализации. Даже возможно сериализировать делегата в состояние Управления?

BP

6
задан theBruce 22 December 2009 в 17:22
поделиться

1 ответ

Нелегко - и это может открыть дверь для потенциальных проблем.

Теоретически возможно использовать рефлексию, чтобы определить, к какому методу объекта обращается делегат, и написать для него пользовательский процесс сериализации. После десериализации снова потребуется написать логику для преобразования информации в ссылку делегата.

Проблема в том, что в общем случае не всегда возможно обнаружить объект во время выполнения, для которого нужно заново сгенерировать делегата. Если делегат ссылается на лямбда или анонимный метод, который еще больше усложняет вещи, поскольку может быть связан с их закрытием.

Вероятно, вам также лучше:

  1. не сохранять делегата Action между запросами и иметь ASP.NET код для повторного прикрепления делегата к постбэку. Это наименее рискованная опция IMHO.

  2. Сохранение ссылки на делегата в состоянии сеанса и повторное прикрепление к дезериализованному объекту при постбэке. Эта опция рискованна по двум причинам:

    a) хранение ссылок на объекты в памяти бесконечно долго, если конечный пользователь никогда не публикует обратно, или вы забываете очистить объект от состояния сервера.

    b) если элементы страницы делегирования ссылок (элементы управления и т.д.) вы можете запустить в тонких ошибках, поскольку делегат будет работать против объектов из предыдущего запроса, а не нового.

4
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: