2013-10-03 2 views
1

Я получаю сообщение об ошибке в следующем заявлении:разница между видом государством и использованием Session

liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]); 

Ошибка, я получаю это:

Type 'System.Web.UI.WebControls.ListItem' in Assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable. 

Но, когда я использую следующие каждую вещь кажется работать идеально ..

liPages = (List<ListItem>)(Session["CurrentSetOfPages"]); 

Просьба разъяснить мне об этом ..

+0

См [http://stackoverflow.com/questions/733482/what-is-the-difference-between-sessionstate-and-viewstate][1] [1]: http://stackoverflow.com/questions/733482/what-is-the-difference-between-sessionstate-and-viewstate – NYSystemsAnalyst

ответ

2

Поскольку результат хранения элементов в ViewState заключается в том, что они хранятся в строке на странице (для поддержания состояния между несколькими запросами), они должны быть сериализуемыми, с другой стороны, сеанс находится в памяти (если вы используете InProc, который по умолчанию, в противном случае это не применяется), поэтому объекты не обязательно должны быть сериализуемыми.

Дополнительно см этого ответа для уточнения: Why Viewstate can contain only serializable object?

Надеется, что это помогает.

+0

Единственный момент, когда объекты не обязательно должны быть сериализуемыми для хранилища сеансов при использовании 'SessionStateMode.InProc'. Все остальные режимы требуют объектов для реализации I сериализации. –

+0

Это правда, я обновил свой ответ. – Robert

1

Viewstate может содержать только сериализуемые объекты, тогда как Session не требует сериализуемых объектов. Вот почему ваш код работает для сеанса, а не для viewstate.

Кроме того, you can't store an object in viewstate unless it's marked as serializable.

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

0

ViewState:

сериализации и десериализации в ViewState является dependendent на ObjectStateFormatter и типа List (общий список) не поддерживается ею. Таким образом, вы получите ошибку.

Для решения этой проблемы вам необходимо обработать собственную сериализацию. Вы можете использовать [Serializable] attitute, чтобы заставить его работать. See this post in stackoverflow. В вашем случае вам нужно создать собственный класс, который наследуется от объекта ListItem, и применить атрибут [Serializable].

Сессия:Please see this post in stackoverflow

Смежные вопросы