Как я могу найти, какой объект в ASP.NET не может быть сериализован?

Я получаю следующую ошибку в моем приложении:

Невозможно сериализовать состояние сеанса. В режимах "StateServer" и "SQLServer" ASP.NET сериализует объекты состояния сеанса, и в результате несериализуемые объекты или объекты MarshalByRef не допускаются. То же ограничение применяется, если аналогичная сериализация выполняется в пользовательском хранилище состояний сеанса в режиме "Пользовательский".

Трассировка стека не дает никакой хорошей информации о том, какой объект не может сериализоваться. Есть ли хороший способ найти проблемного ребенка?

Изменить: я обнаружил проблему, я пытался сериализовать оператор Linq (не выполняется). Но я постараюсь выбрать ответ, который лучше всего решил бы эту проблему.

5 ответов

Решение

На самом деле, вы должны в основном хранить свои собственные данные / объекты состояния (в идеале смоделированные как классы DTO), и в этом случае ответом будет: любой, который вы пометите как [Serializable] или же ISerializable, Вы не должны добавлять необработанные элементы управления пользовательского интерфейса или другие неизвестные объекты в состояние сеанса. В частности, по таким причинам, которые оказали значительное влияние на производительность приложения на днях.

MbUnit (сейчас Gallio) имеет тест Assert.IsSerializable(), который может пригодиться здесь.

Вы можете попробовать сериализовать объект и проверить System.Runtime.Serialization.SerializationException это бросается, когда это не сериализуемо. Он должен сказать вам, какой член или родительский объект объекта не может быть сериализован.

Пример кода:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f.Serialize(new System.IO.MemoryStream(), yourObject);

Лучшее, что я мог бы сделать в подобной ситуации, - это посмотреть на каждый объект, на который ссылается Session, и проверить его на наличие атрибута Serializable (или того, что объект реализует интерфейс ISerialzable).

Вы можете найти типы преступников, которые запускают исключение сериализации через отладку кода.NET Framework. По крайней мере, так я и сделал.

Другие вопросы по тегам