Вы получаете ошибку удаленного вызова процедуры. Я не могу объяснить, почему вы получаете эту ошибку или почему извлечение в локальную переменную исправляет ее.
Однако я могу сказать, что это действительно плохая идея. Когда вы сохраняете такой объект в объекте Session, вы создаете связь между текущим потоком, выполняющим скрипт, и сессией. В результате все последующие запросы для этого сеанса теперь должны обрабатываться только этим конкретным потоком. Если этот поток занят обработкой чужого запроса, запрос сеансов ставится в очередь, даже если имеется множество доступных рабочих потоков, которые можно использовать. Следовательно, сохранение объекта в сеансе может значительно повредить масштабируемости приложения.
Я бы также усомнился в целесообразности хранения словаря в чем-то, что уже является словарем?
Почему не просто пользователь: -
Dim userID : userID = Session("user_id")
Где все, что вы обычно сохраняли бы в словаре "user", например, "id", просто имело бы префикс "user_" и сохранялось непосредственно в сеансе?